/ Hex Artifact Content
Login

Artifact f7bb37c27b3734d58796febb30b5d818b3b4eb592b57b88039e5d92b3ebd9dab:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5a40: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5a50: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5a60: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
5a70: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
5a80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
5a90: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5aa0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5ac0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5ad0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5ae0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5b10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5b40: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5b50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5b70: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
5b80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5b90: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5ba0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5bd0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5be0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5bf0: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5c00: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5c10: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5c20: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5c30: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5c40: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5c50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
5c60: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5c70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5c80: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5c90: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5ca0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5cb0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5cc0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5cd0: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5cf0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5d00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5d10: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5d20: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5d30: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5d40: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5d50: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
5d60: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5d70: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d80: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5d90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5da0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5db0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5dd0: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5de0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5df0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5e00: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5e10: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e30: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5e40: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5e50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5e60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5e70: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5e80: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5e90: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ea0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5eb0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5ee0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5ef0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5f00: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5f10: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5f20: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5f40: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5f50: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5f60: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5f70: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5f80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5f90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5fa0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5fb0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5fc0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5fd0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5fe0: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5ff0: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
6000: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
6010: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
6020: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
6030: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
6040: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
6050: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
6060: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
6070: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
6080: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
60a0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
60b0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
60c0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
60d0: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
60e0: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
60f0: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
6100: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
6110: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
6120: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
6130: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
6140: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
6150: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
6160: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
6170: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
6180: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
6190: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
61a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
61b0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
61c0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
61d0: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
61e0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
61f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
6200: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
6210: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
6220: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
6230: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
6240: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
6250: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6260: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
6270: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
6280: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
6290: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
62a0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
62b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
62c0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
62d0: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
62e0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
62f0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
6300: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
6310: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
6320: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6330: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
6340: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
6350: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
6360: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
6370: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
6380: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6390: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
63a0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
63b0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
63c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
63d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
63e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
63f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6400: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6410: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6420: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6430: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6440: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6450: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6460: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6470: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6480: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
6490: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
64a0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
64b0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
64c0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
64d0: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
64e0: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
64f0: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6520: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6530: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6540: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6550: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
6560: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
6570: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
6580: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
6590: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
65a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
65b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
65c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
65d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
65e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
65f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6600: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6610: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6620: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6630: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6650: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6660: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6670: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6690: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
66a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
66b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
66d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
66e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
66f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6700: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6710: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6720: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6730: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6740: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6750: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6760: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6770: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6780: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6790: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
67a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
67b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
67c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
67d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
67e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
67f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6810: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6840: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
6850: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
6860: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6870: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
6880: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
6890: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
68a0: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
68d0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
68e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
68f0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
6900: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
6910: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
6920: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6930: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
6940: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6950: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
6960: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
6970: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6980: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
6990: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
69a0: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
69b0: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
69c0: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
69d0: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
69e0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
69f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
6a00: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
6a10: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
6a20: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
6a30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
6a40: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
6a70: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
6a80: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
6a90: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
6aa0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
6ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
6ac0: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
6ad0: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
6ae0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
6af0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
6b00: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
6b10: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
6b20: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
6b30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
6b40: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
6b50: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
6b60: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6b90: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
6ba0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6bd0: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
6be0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
6bf0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
6c00: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
6c10: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
6c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6c30: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6c40: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6c60: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6c70: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
6c80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6c90: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6ca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cc0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6cd0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6ce0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6cf0: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6d00: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6d20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6d30: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
6d40: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
6d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6d60: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6d70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6d80: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6d90: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6da0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6db0: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6dc0: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6dd0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6de0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6df0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6e00: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6e20: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6e30: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6e40: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6e50: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6e60: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6e70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6e80: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6e90: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6ea0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6eb0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6ec0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6ed0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6ee0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6ef0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6f00: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6f10: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6f20: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6f30: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6f60: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6f70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6f90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6fa0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6fb0: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6fc0: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6fd0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6fe0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6ff0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
7000: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
7010: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
7020: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
7030: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
7040: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
7050: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
7060: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
7070: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
7080: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
7090: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
70a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
70b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
70c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
70d0: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
70e0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
70f0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
7100: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7110: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
7120: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
7130: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
7140: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
7150: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
7160: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
7170: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7180: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
71a0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
71c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
71d0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
71e0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
71f0: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
7200: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7210: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
7220: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
7230: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
7240: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7250: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
7260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
7270: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
7280: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
7290: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
72a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
72b0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
72c0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
72d0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
72e0: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
72f0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
7300: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
7310: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
7320: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
7330: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
7340: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
7350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
7360: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
7370: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
7380: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
7390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
73a0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
73b0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
73c0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
73d0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
73e0: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
73f0: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7400: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7410: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7420: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7430: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
7440: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
7450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7460: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7470: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
7480: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
7490: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
74a0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
74b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
74c0: 72 20 74 6f 20 61 20 66 61 6b 65 20 42 74 43 75  r to a fake BtCu
74d0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 68 61 74  rsor object that
74e0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73   will always ans
74f0: 77 65 72 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20  wer.** false to 
7500: 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
7510: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
7520: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 20   routine above. 
7530: 20 54 68 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72   The fake.** cur
7540: 73 6f 72 20 72 65 74 75 72 6e 65 64 20 6d 75 73  sor returned mus
7550: 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  t not be used wi
7560: 74 68 20 61 6e 79 20 6f 74 68 65 72 20 42 74 72  th any other Btr
7570: 65 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ee interface..*/
7580: 0a 42 74 43 75 72 73 6f 72 20 2a 73 71 6c 69 74  .BtCursor *sqlit
7590: 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c 69 64  e3BtreeFakeValid
75a0: 43 75 72 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20  Cursor(void){.  
75b0: 73 74 61 74 69 63 20 75 38 20 66 61 6b 65 43 75  static u8 fakeCu
75c0: 72 73 6f 72 20 3d 20 43 55 52 53 4f 52 5f 56 41  rsor = CURSOR_VA
75d0: 4c 49 44 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  LID;.  assert( o
75e0: 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
75f0: 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a  , eState)==0 );.
7600: 20 20 72 65 74 75 72 6e 20 28 42 74 43 75 72 73    return (BtCurs
7610: 6f 72 2a 29 26 66 61 6b 65 43 75 72 73 6f 72 3b  or*)&fakeCursor;
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7630: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
7640: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
7650: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
7660: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7670: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7680: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7690: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
76a0: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
76b0: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
76c0: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
76d0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
76e0: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
76f0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7700: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
7710: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
7720: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
7730: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
7740: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
7750: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
7760: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7770: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7780: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7790: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
77a0: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
77b0: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
77c0: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
77d0: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
77e0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
77f0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7800: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
7810: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
7820: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
7830: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
7840: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
7850: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
7860: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7870: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7880: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7890: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
78a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78b0: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
78c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
78d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
78e0: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
78f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7900: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
7910: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
7920: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7940: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
7950: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
7960: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7970: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7990: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
79a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
79b0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
79c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
79d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
79e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
79f0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7a00: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
7a10: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
7a20: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
7a30: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
7a40: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
7a50: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
7a60: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7a70: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7a80: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7a90: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
7aa0: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
7ab0: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
7ac0: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
7ad0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
7ae0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7af0: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7b00: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
7b10: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
7b20: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
7b30: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
7b40: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
7b50: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
7b60: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7b70: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7b80: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7b90: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
7ba0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7bb0: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
7bc0: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
7bd0: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
7be0: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
7bf0: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7c00: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
7c10: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
7c20: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
7c30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7c40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
7c50: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
7c60: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7c70: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7c80: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7c90: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7ca0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
7cb0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
7cc0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
7cd0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
7ce0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
7cf0: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7d00: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
7d10: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
7d20: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
7d30: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
7d40: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
7d50: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7d60: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7d70: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7d80: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7d90: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7da0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7db0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7dc0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7dd0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7de0: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7df0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7e00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7e10: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7e20: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
7e30: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
7e40: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
7e50: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7e60: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7e70: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7e80: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7e90: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7ea0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7eb0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7ec0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7ed0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7ee0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7ef0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7f00: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7f10: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7f20: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7f30: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7f40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7f50: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7f60: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7f70: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7f80: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7f90: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7fa0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7fb0: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7fc0: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7fd0: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7fe0: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7ff0: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
8000: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
8010: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
8020: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
8030: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
8040: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
8050: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8060: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
8070: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
8080: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
8090: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
80a0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
80b0: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
80c0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
80d0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
80e0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
80f0: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
8100: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
8110: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8120: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
8130: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8140: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
8150: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
8160: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
8170: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
8180: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
8190: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
81a0: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
81b0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
81c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81d0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
81e0: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
81f0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
8200: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
8210: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
8220: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8230: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
8240: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
8250: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
8260: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
8270: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
8280: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
8290: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
82a0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
82b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
82c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
82d0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
82e0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
82f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8300: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
8310: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
8320: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
8330: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8340: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
8350: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
8360: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
8370: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
8380: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
8390: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
83a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
83b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
83c0: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
83d0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
83e0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
83f0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8400: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
8410: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8420: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8430: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
8440: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
8450: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
8460: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8470: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
8480: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
8490: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
84a0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
84b0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
84c0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
84d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
84e0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
84f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8500: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
8510: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
8520: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
8530: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8540: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
8550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
8560: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
8570: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8580: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
8590: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
85a0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
85b0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
85c0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
85d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
85e0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
85f0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
8600: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
8610: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8620: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
8630: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
8640: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
8650: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8660: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8670: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8680: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
86a0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
86b0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
86c0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
86d0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
86e0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
86f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8700: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
8710: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
8720: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8730: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
8740: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
8750: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8760: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8770: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8780: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8790: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
87a0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
87b0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
87c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
87d0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
87e0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
87f0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8800: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8810: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
8820: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
8830: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
8840: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
8850: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8860: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8870: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8880: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8890: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
88a0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
88b0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
88c0: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
88d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
88e0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
88f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8900: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8910: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8920: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
8930: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
8940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
8950: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
8960: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8970: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8980: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8990: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
89a0: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
89b0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
89c0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
89d0: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
89e0: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
89f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8a00: 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20  PGNO(iPtrmap);. 
8a10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8a20: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
8a30: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
8a40: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8a50: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
8a60: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
8a70: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
8a80: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
8a90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
8aa0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
8ab0: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
8ac0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8ad0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8ae0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8af0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8b00: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8b10: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8b20: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8b30: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8b40: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8b50: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8b60: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8b70: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8b80: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8b90: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8ba0: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8bb0: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8bc0: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8bd0: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8be0: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8c00: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8c10: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8c20: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8c30: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8c40: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8c50: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8c60: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8c70: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8c80: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8c90: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8ca0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
8cb0: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
8cc0: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
8cd0: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
8ce0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8cf0: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
8d00: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
8d10: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
8d20: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
8d30: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
8d40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8d50: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
8d60: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
8d70: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
8d80: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
8d90: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
8da0: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
8db0: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
8dc0: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
8dd0: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
8de0: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
8df0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
8e00: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
8e10: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8e20: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
8e30: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
8e40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
8e50: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8e60: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8e70: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8ea0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8eb0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8ec0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8ed0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8ee0: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
8ef0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
8f00: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
8f10: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
8f20: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
8f30: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
8f40: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
8f50: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
8f60: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
8f70: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
8f80: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8f90: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
8fa0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
8fb0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
8fc0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
8fd0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
8fe0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
8ff0: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9000: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9010: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9020: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9030: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
9040: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
9050: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
9060: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
9070: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
9080: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9090: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
90a0: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
90b0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
90c0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
90d0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
90e0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
90f0: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9100: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9110: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9120: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9130: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
9140: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
9150: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
9160: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
9170: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9180: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
9190: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
91a0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
91b0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
91c0: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
91d0: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
91e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
91f0: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9200: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9210: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9220: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9230: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
9240: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
9250: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9260: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9270: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
9280: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
9290: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
92a0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
92b0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
92c0: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
92d0: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
92e0: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
92f0: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9300: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9310: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9320: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9330: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
9340: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
9350: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
9360: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
9370: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
9380: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
9390: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
93a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
93b0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
93c0: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
93d0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
93e0: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
93f0: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9400: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9410: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9420: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9430: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
9440: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
9450: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
9460: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
9470: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
9480: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
9490: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
94a0: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
94b0: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
94c0: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
94d0: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
94e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
94f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9500: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9510: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9520: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9530: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9540: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9560: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9570: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9580: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9590: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
95a0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
95b0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
95c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
95d0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
95e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
95f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9600: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9610: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9620: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9630: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9640: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9650: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
9660: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
9670: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
9680: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
9690: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
96a0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
96b0: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
96d0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
96e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
96f0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9700: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9710: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9730: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9740: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9750: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9760: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9770: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9780: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9790: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
97a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
97b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
97c0: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
97d0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
97e0: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
97f0: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9800: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9810: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9820: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9830: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9840: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9850: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9860: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9870: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9880: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9890: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
98a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
98b0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
98c0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
98d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
98e0: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
98f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9900: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9910: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9920: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9930: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9940: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9950: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9960: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9970: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9980: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9990: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
99a0: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
99b0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
99c0: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
99d0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
99e0: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
99f0: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9a00: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9a10: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9a20: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9a30: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9a40: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9a50: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9a60: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9a70: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9a80: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9a90: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9aa0: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9ab0: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9ac0: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9ad0: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9ae0: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9af0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9b00: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9b10: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9b20: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9b30: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9b40: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9b50: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9b60: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9b70: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9b80: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9b90: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9ba0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9bb0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9bc0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9bd0: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9be0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9bf0: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9c10: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9c20: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9c50: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9c60: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9c70: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9c80: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9c90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9ca0: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9cb0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9cc0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9cd0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9ce0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9cf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9d00: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9d10: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9d20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9d30: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
9d40: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
9d50: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
9d60: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
9d70: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9d80: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
9d90: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9da0: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9db0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9dc0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9dd0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9de0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9df0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9e00: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9e10: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9e20: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
9e30: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
9e40: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
9e50: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
9e60: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
9e70: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
9e80: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
9e90: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
9ea0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9eb0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9ec0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9ed0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9ef0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9f00: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9f10: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9f20: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9f30: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9f40: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f60: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9f70: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9f80: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9fa0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
9fb0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
9fc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9fd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9fe0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9ff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a000: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a010: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a020: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a030: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a040: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a050: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a060: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a070: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a080: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a090: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a0a0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a0b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a0c0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a0d0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a0e0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a0f0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a100: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a110: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a120: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a130: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a140: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a150: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a160: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a170: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a180: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a190: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a1a0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a1b0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a1c0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a1d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a1e0: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a1f0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a200: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a210: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a220: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a230: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a240: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a250: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a260: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a270: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a280: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a290: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a2a0: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a2b0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a2c0: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a2d0: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a2e0: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a2f0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a300: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a310: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a320: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a330: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a340: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a350: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a360: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a370: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a380: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a390: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a3a0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a3b0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a3c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a3d0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a3e0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a3f0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a400: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a410: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a420: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a430: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a440: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a450: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a470: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a480: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a490: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a4a0: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a4b0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a4c0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a4d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a4e0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a4f0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a500: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a510: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a520: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a530: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a540: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a550: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a560: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a570: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a580: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a590: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a5a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a5b0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a5c0: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a5d0: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a5e0: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a5f0: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a600: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a610: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a620: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a630: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a640: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a650: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a660: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a670: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a680: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a690: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
a6a0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
a6b0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6e0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a6f0: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
a700: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
a730: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
a740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a750: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
a760: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a770: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
a780: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
a790: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
a7a0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
a7b0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
a7c0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
a7d0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
a7e0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
a7f0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
a800: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
a810: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
a820: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
a830: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
a840: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
a850: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
a860: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
a870: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
a880: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a890: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
a8a0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
a8b0: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
a8c0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
a8d0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
a8e0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a8f0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
a900: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a910: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
a920: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
a930: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
a940: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
a950: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a960: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
a970: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
a980: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
a990: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
a9a0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
a9b0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
a9c0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
a9d0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
a9e0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
a9f0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
aa00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
aa10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
aa20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
aa30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
aa40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
aa50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
aa60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
aa70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
aa80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
aa90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
aaa0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
aab0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
aac0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
aad0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
aae0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
aaf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ab00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ab10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ab20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ab30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
ab40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
ab50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
ab60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
ab70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
ab80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
ab90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
aba0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
abb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
abc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
abd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
abe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
abf0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
ac00: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
ac10: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
ac20: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
ac30: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
ac40: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
ac50: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
ac60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
ac70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
ac80: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
ac90: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
aca0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
acb0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
acc0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
acd0: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
ace0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
acf0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
ad00: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
ad10: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
ad20: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
ad30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
ad40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ad50: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
ad60: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
ad70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ad80: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
ad90: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
ada0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
adb0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
adc0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
add0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
ade0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
adf0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
ae00: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
ae10: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
ae20: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
ae30: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
ae40: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
ae50: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
ae60: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
ae70: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
ae80: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
ae90: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
aea0: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
aeb0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
aec0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
aed0: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
aee0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
aef0: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
af00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
af10: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
af20: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
af30: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
af40: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
af50: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
af60: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
af70: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
af80: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
af90: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
afa0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
afb0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
afc0: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
afd0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
afe0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
aff0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b000: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b010: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b020: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b030: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b040: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b050: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b060: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b070: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b080: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b090: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b0a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b0b0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b0c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
b0d0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
b0e0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
b0f0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
b100: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
b110: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
b120: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
b130: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
b140: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
b150: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
b160: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
b170: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
b180: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
b190: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
b1a0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
b1b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
b1c0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
b1d0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
b1e0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
b1f0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
b200: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c  );.  if( info.nL
b210: 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
b220: 61 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ad ){.    Pgno o
b230: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
b240: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell[info.nSize
b250: 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  -4]);.    ptrmap
b260: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
b270: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
b280: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
b290: 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d  gno, pRC);.  }.}
b2a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
b2b0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
b2c0: 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20  age given. This 
b2d0: 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69  routine reorgani
b2e0: 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  zes cells within
b2f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20   the.** page so 
b300: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
b310: 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e  o free-blocks on
b320: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
b330: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  list..**.** Para
b340: 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69  meter nMaxFrag i
b350: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
b360: 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74  ount of fragment
b370: 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d 61  ed space that ma
b380: 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20  y be.** present 
b390: 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74 65  in the page afte
b3a0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
b3b0: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56  eturns..**.** EV
b3c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
b3d0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
b3e0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
b3f0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
b400: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
b410: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
b420: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
b430: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
b440: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
b450: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
b460: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
b470: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
b480: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
b490: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
b4a0: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
b4b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
b4c0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
b4d0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
b4e0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b4f0: 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a   int nMaxFrag){.
b500: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b520: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b530: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b550: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
b560: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
b570: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
b580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
b590: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
b5a0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
b5b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b5c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b5d0: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
b5e0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b5f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b600: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
b610: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
b620: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
b630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b640: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
b650: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
b660: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
b690: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b6a0: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
b6b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b6c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b6d0: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
b6e0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
b6f0: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
b700: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
b710: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
b720: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
b730: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
b740: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
b750: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b760: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
b770: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
b780: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
b790: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
b7a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
b7b0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
b7c0: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
b7d0: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
b7e0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
b7f0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
b800: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
b810: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b820: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b830: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b840: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b850: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b860: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b870: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
b880: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
b890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b8a0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
b8b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b8c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b8d0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b8e0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
b8f0: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
b900: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
b910: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b920: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
b930: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
b940: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
b950: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
b960: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
b970: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
b980: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43  [hdr+3]) );.  iC
b990: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
b9a0: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b  ffset + 2*nCell;
b9b0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
b9c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b9d0: 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68  leSize;..  /* Th
b9e0: 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
b9f0: 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20   pages with two 
ba00: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c  or fewer free bl
ba10: 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61  ocks and nMaxFra
ba20: 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20  g.  ** or fewer 
ba30: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
ba40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
ba50: 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d  t is faster to m
ba60: 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  ove the.  ** two
ba70: 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73   (or one) blocks
ba80: 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20   of cells using 
ba90: 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64  memmove() and ad
baa0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20  d the required. 
bab0: 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65   ** offsets to e
bac0: 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ach pointer in t
bad0: 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
bae0: 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73  array than it is
baf0: 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73   to .  ** recons
bb00: 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65  truct the entire
bb10: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28   page.  */.  if(
bb20: 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37   (int)data[hdr+7
bb30: 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20  ]<=nMaxFrag ){. 
bb40: 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67     int iFree = g
bb50: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
bb60: 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  r+1]);.    if( i
bb70: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Free ){.      in
bb80: 74 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62  t iFree2 = get2b
bb90: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d  yte(&data[iFree]
bba0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67  );..      /* pag
bbb0: 65 46 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20  eFindSlot() has 
bbc0: 61 6c 72 65 61 64 79 20 76 65 72 69 66 69 65 64  already verified
bbd0: 20 74 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b   that free block
bbe0: 73 20 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20  s are sorted.   
bbf0: 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f     ** in order o
bc00: 66 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  f offset within 
bc10: 74 68 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68  the page, and th
bc20: 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65  at no block exte
bc30: 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73  nds.      ** pas
bc40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
bc50: 20 70 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20   page. Provided 
bc60: 74 68 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f  the two free slo
bc70: 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20  ts do not .     
bc80: 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69   ** overlap, thi
bc90: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
bca0: 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20  t the memmove() 
bcb0: 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c  calls below will
bcc0: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76   not.      ** ov
bcd0: 65 72 77 72 69 74 65 20 74 68 65 20 75 73 61 62  erwrite the usab
bce0: 6c 65 53 69 7a 65 20 62 79 74 65 20 62 75 66 66  leSize byte buff
bcf0: 65 72 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  er, even if the 
bd00: 64 61 74 61 62 61 73 65 20 70 61 67 65 0a 20 20  database page.  
bd10: 20 20 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70      ** is corrup
bd20: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  t.  */.      ass
bd30: 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c  ert( iFree2==0 |
bd40: 7c 20 69 46 72 65 65 32 3e 69 46 72 65 65 20 29  | iFree2>iFree )
bd50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bd60: 69 46 72 65 65 2b 67 65 74 32 62 79 74 65 28 26  iFree+get2byte(&
bd70: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c  data[iFree+2]) <
bd80: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
bd90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
bda0: 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65  ree2==0 || iFree
bdb0: 32 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2+get2byte(&data
bdc0: 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75  [iFree2+2]) <= u
bdd0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20  sableSize );..  
bde0: 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65      if( 0==iFree
bdf0: 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65  2 || (data[iFree
be00: 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46  2]==0 && data[iF
be10: 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20  ree2+1]==0) ){. 
be20: 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20         u8 *pEnd 
be30: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
be40: 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
be50: 20 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72         u8 *pAddr
be60: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
be70: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
be80: 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
be90: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29  (&data[iFree+2])
bea0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  ;.        int to
beb0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
bec0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
bed0: 20 20 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72      if( top>=iFr
bee0: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
bef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bf00: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
bf10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
bf20: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20       if( iFree2 
bf30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
bf40: 65 72 74 28 20 69 46 72 65 65 2b 73 7a 3c 3d 69  ert( iFree+sz<=i
bf50: 46 72 65 65 32 20 29 3b 20 2f 2a 20 56 65 72 69  Free2 ); /* Veri
bf60: 66 69 65 64 20 62 79 20 70 61 67 65 46 69 6e 64  fied by pageFind
bf70: 53 6c 6f 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  Slot() */.      
bf80: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
bf90: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
bfa0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  2]);.          a
bfb0: 73 73 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b  ssert( iFree+sz+
bfc0: 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65  sz2+iFree2-(iFre
bfd0: 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+sz) <= usableS
bfe0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
bff0: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
c000: 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64  Free+sz+sz2], &d
c010: 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69  ata[iFree+sz], i
c020: 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29  Free2-(iFree+sz)
c030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
c040: 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20  += sz2;.        
c050: 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d  }.        cbrk =
c060: 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20   top+sz;.       
c070: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69   assert( cbrk+(i
c080: 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61  Free-top) <= usa
c090: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
c0a0: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
c0b0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f  [cbrk], &data[to
c0c0: 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a  p], iFree-top);.
c0d0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64          for(pAdd
c0e0: 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  r=&data[cellOffs
c0f0: 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b  et]; pAddr<pEnd;
c100: 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20   pAddr+=2){.    
c110: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
c120: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
c130: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72        if( pc<iFr
c140: 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  ee ){ put2byte(p
c150: 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a  Addr, pc+sz); }.
c160: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
c170: 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20  f( pc<iFree2 ){ 
c180: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
c190: 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20  pc+sz2); }.     
c1a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
c1b0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  o defragment_out
c1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c1d0: 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73    }..  cbrk = us
c1e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
c1f0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c200: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
c210: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
c220: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
c230: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
c240: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
c250: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
c260: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
c270: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
c280: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
c290: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c2a0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
c2b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c2c0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
c2d0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
c2e0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
c2f0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
c300: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
c310: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
c320: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
c330: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
c340: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
c350: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c360: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c380: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c390: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
c3a0: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
c3b0: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
c3c0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
c3d0: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
c3e0: 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b  ize(pPage, &src[
c3f0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
c400: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
c410: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
c420: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c430: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c450: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
c470: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
c480: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
c490: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
c4a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
c4b0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
c4c0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
c4d0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c4f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c500: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
c510: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
c520: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
c530: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
c540: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
c550: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
c560: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
c570: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
c580: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
c590: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
c5a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
c5b0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
c5c0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
c5d0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
c5e0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
c5f0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
c600: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
c610: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
c620: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
c630: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
c640: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
c650: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
c660: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
c670: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c680: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c690: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
c6a0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
c6b0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
c6c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c6d0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
c6e0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
c6f0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
c700: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
c710: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
c720: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
c730: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c740: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c750: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c760: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
c770: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c780: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
c790: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
c7a0: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
c7b0: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
c7c0: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
c7d0: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
c7e0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
c7f0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
c800: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
c810: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
c820: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
c830: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
c840: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
c850: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
c860: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
c870: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
c880: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
c890: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
c8a0: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
c8b0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
c8c0: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
c8d0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
c8e0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
c8f0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
c900: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
c910: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
c920: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
c930: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
c940: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
c950: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
c960: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
c970: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
c980: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
c990: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
c9a0: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
c9b0: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
c9c0: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
c9d0: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
c9e0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
c9f0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
ca00: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
ca10: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
ca20: 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20  rOffset;.  u8 * 
ca30: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
ca40: 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  g->aData;.  int 
ca50: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
ca60: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
ca70: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
ca80: 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  r]);.  int x;.  
ca90: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
caa0: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
cab0: 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 73 69 7a  eSize;.  int siz
cac0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
cad0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
cae0: 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73  e slot */..  ass
caf0: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 77  ert( pc>0 );.  w
cb00: 68 69 6c 65 28 20 70 63 3c 3d 75 73 61 62 6c 65  hile( pc<=usable
cb10: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a  Size-4 ){.    /*
cb20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cb30: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
cb40: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
cb50: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
cb60: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
cb70: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
cb80: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
cb90: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
cba0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
cbb0: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
cbc0: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
cbd0: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
cbe0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
cbf0: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
cc00: 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69  .    if( (x = si
cc10: 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29  ze - nByte)>=0 )
cc20: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
cc30: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
cc40: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
cc50: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
cc60: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
cc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
cc80: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
cc90: 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20  T_PAGE(pPg);.   
cca0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ccb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
ccc0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <4 ){.        /*
ccd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cce0: 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61  11498-58022 In a
ccf0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
cd00: 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f  ree page, the to
cd10: 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  tal.        ** n
cd20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
cd30: 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20  n fragments may 
cd40: 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a  not exceed 60. *
cd50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  /.        if( aD
cd60: 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20  ata[hdr+7]>57 ) 
cd70: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20  return 0;..     
cd80: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
cd90: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
cda0: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
cdb0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
cdc0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
cdd0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
cde0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
cdf0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
ce00: 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44  Data[iAddr], &aD
ce10: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
ce20: 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37       aData[hdr+7
ce30: 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20  ] += (u8)x;.    
ce40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ce50: 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d   /* The slot rem
ce60: 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ains on the free
ce70: 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74  -list. Reduce it
ce80: 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e  s size to accoun
ce90: 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  t.         ** fo
cea0: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
ceb0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
cec0: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
ced0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61       put2byte(&a
cee0: 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  Data[pc+2], x);.
cef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
cf00: 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b  turn &aData[pc +
cf10: 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   x];.    }.    i
cf20: 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70  Addr = pc;.    p
cf30: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
cf40: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66  ata[pc]);.    if
cf50: 28 20 70 63 3c 69 41 64 64 72 2b 73 69 7a 65 20  ( pc<iAddr+size 
cf60: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
cf70: 66 28 20 70 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( pc ){.    *pR
cf80: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
cf90: 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20  PT_PAGE(pPg);.  
cfa0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
cfb0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
cfc0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
cfd0: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
cfe0: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
cff0: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
d000: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d010: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
d020: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
d030: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
d040: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
d050: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
d060: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
d070: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
d080: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
d090: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
d0a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
d0b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
d0c0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
d0d0: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
d0e0: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
d0f0: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
d100: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
d110: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
d120: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
d130: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
d140: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
d150: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
d160: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
d170: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
d180: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
d190: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
d1a0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d1b0: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
d1c0: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
d1d0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
d1e0: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
d1f0: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
d200: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
d210: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
d220: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
d230: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
d240: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
d250: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
d260: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
d270: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
d280: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
d290: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d2a0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
d2b0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
d2c0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
d2d0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
d2e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
d2f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d300: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
d310: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d340: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
d350: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d360: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d370: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
d390: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
d3a0: 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20  */.  int gap;   
d3b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d3c0: 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65  te of gap betwee
d3d0: 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  n cell pointers 
d3e0: 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  and cell content
d3f0: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
d400: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
d410: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
d420: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d430: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
d440: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d450: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d460: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d470: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d480: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
d490: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
d4a0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
d4b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
d4c0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
d4d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
d4e0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
d4f0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28  ssert( nByte < (
d500: 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d  int)(pPage->pBt-
d510: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29  >usableSize-8) )
d520: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
d530: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
d540: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
d550: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
d560: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
d570: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
d580: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
d590: 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29  rt( gap<=65536 )
d5a0: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
d5b0: 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39  OF: R-29356-0239
d5c0: 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  1 If the databas
d5d0: 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62  e uses a 65536-b
d5e0: 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20  yte page size.  
d5f0: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72  ** and the reser
d600: 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72  ved space is zer
d610: 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c  o (the usual val
d620: 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20  ue for reserved 
d630: 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e  space).  ** then
d640: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d650: 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65  t offset of an e
d660: 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20  mpty page wants 
d670: 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a  to be 65536..  *
d680: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
d690: 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c  integer is too l
d6a0: 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65  arge to be store
d6b0: 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e  d in a 2-byte un
d6c0: 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65  signed.  ** inte
d6d0: 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20  ger, so a value 
d6e0: 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20  of 0 is used in 
d6f0: 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20  its place. */.  
d700: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
d710: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
d720: 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e  assert( top<=(in
d730: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
d740: 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50  ableSize ); /* P
d750: 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64  revent by getAnd
d760: 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20  InitPage() */.  
d770: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
d780: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26     if( top==0 &&
d790: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d7a0: 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29  bleSize==65536 )
d7b0: 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35  {.      top = 65
d7c0: 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  536;.    }else{.
d7d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d7e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
d7f0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
d800: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
d810: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
d820: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
d830: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
d840: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
d850: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
d860: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
d870: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
d880: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
d890: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
d8a0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
d8b0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
d8c0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
d8d0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
d8e0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
d8f0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
d900: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d910: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
d920: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
d930: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
d940: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
d950: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
d960: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
d970: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
d980: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
d990: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
d9a0: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
d9b0: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
d9c0: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
d9d0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
d9e0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
d9f0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
da00: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
da10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
da20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
da30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
da40: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
da50: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
da60: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
da70: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
da80: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
da90: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
daa0: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
dab0: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
dac0: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
dad0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
dae0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
daf0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
db00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
db10: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
db20: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
db30: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
db40: 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28  Page(pPage, MIN(
db50: 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  4, pPage->nFree 
db60: 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20  - (2+nByte)));. 
db70: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
db80: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
db90: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
dba0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
dbb0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
dbc0: 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  2+nByte<=top );.
dbd0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
dbe0: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
dbf0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
dc00: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
dc10: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
dc20: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
dc30: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
dc40: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
dc50: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
dc60: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
dc70: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
dc80: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
dc90: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
dca0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
dcb0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
dcc0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
dcd0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
dce0: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
dcf0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
dd00: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
dd10: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
dd20: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
dd30: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
dd40: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
dd50: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
dd60: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
dd70: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dd80: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
dd90: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
dda0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ddb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ddc0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
ddd0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
dde0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
ddf0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
de00: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
de10: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
de20: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
de30: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
de40: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
de50: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
de60: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
de70: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
de80: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  esced..**.** Not
de90: 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
dea0: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
deb0: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
dec0: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
ded0: 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ge(),.** that ro
dee0: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
def0: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
df00: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
df10: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
df20: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
df30: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
df40: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
df50: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
df60: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
df70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
df80: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
df90: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
dfa0: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
dfb0: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
dfc0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
dfd0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
dfe0: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
dff0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
e000: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
e010: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
e020: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
e030: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
e040: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e060: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
e070: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
e080: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
e090: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0b0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
e0c0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
e0d0: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
e100: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
e110: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
e120: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
e150: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
e160: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
e170: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e190: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
e1a0: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36  f iSize */.  u16
e1b0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
e1e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e1f0: 61 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  a */.  u32 iEnd 
e200: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
e210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e220: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
e230: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
e240: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
e250: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
e260: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
e270: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
e280: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e290: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
e2a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e2b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
e2c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e2d0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e2e0: 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e  PT_DB || iStart>
e2f0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
e300: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
e310: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
e320: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
e330: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
e340: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e350: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
e360: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e370: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e380: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e390: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
e3a0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
e3b0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
e3c0: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
e3d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e3e0: 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a  eSize-4 );..  /*
e3f0: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
e400: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
e410: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
e420: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
e430: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
e440: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
e450: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
e460: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
e470: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
e480: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
e490: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
e4a0: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
e4b0: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
e4c0: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
e4d0: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
e4e0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
e4f0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
e500: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
e510: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
e520: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
e530: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
e540: 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  )<iStart ){.    
e550: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
e560: 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  Ptr+4 ){.       
e570: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30   if( iFreeBlk==0
e580: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5a0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
e5b0: 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
e5c0: 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42     iPtr = iFreeB
e5d0: 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  lk;.    }.    if
e5e0: 28 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65  ( iFreeBlk>pPage
e5f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e600: 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  e-4 ){.      ret
e610: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e620: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e630: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
e640: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
e650: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
e660: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
e670: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
e680: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
e690: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
e6a0: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
e6b0: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
e6c0: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
e6d0: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
e6e0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
e6f0: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
e700: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
e710: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
e720: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
e730: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
e740: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
e750: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
e760: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
e770: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
e780: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
e790: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
e7a0: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
e7b0: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
e7c0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e7d0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45  pPage);.      iE
e7e0: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
e7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e800: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
e810: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
e820: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e830: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
e840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e850: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
e860: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e870: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
e880: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
e890: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
e8a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
e8b0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
e8c0: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
e8d0: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
e8e0: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
e8f0: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
e900: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
e910: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
e920: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
e930: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
e940: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
e950: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
e960: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e970: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
e980: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
e990: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
e9a0: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
e9b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
e9c0: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
e9d0: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
e9e0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
e9f0: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
ea00: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
ea10: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
ea20: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Page);.        n
ea30: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
ea40: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
ea50: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
ea60: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
ea70: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
ea80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ea90: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
eaa0: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
eab0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
eac0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64  GE(pPage);.    d
ead0: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
eae0: 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67  rag;.  }.  x = g
eaf0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
eb00: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74  r+5]);.  if( iSt
eb10: 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a  art<=x ){.    /*
eb20: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
eb30: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
eb40: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
eb50: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
eb60: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
eb70: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
eb80: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
eb90: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
eba0: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
ebb0: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
ebc0: 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c  .    if( iStart<
ebd0: 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31  x || iPtr!=hdr+1
ebe0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ebf0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ec00: 61 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  age);.    put2by
ec10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  te(&data[hdr+1],
ec20: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
ec30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ec40: 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20  dr+5], iEnd);.  
ec50: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
ec60: 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65  sert the new fre
ec70: 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20  eblock into the 
ec80: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20  freelist */.    
ec90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
eca0: 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20  Ptr], iStart);. 
ecb0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
ecc0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
ecd0: 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20  BTS_FAST_SECURE 
ece0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
ecf0: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
ed00: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
ed10: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
ed20: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
ed30: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
ed40: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
ed50: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
ed60: 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  0, iSize);.  }. 
ed70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ed80: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
ed90: 6b 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  k);.  put2byte(&
eda0: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
edb0: 69 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  iSize);.  pPage-
edc0: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
edd0: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
ede0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
edf0: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
ee00: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
ee10: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
ee20: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
ee30: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
ee40: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
ee50: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
ee60: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
ee70: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
ee80: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
ee90: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
eea0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
eeb0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
eec0: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
eed0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
eee0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
eef0: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
ef00: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
ef10: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
ef20: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
ef30: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
ef40: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
ef50: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ef60: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
ef70: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
ef80: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
ef90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
efa0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
efb0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
efc0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
efd0: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
efe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
eff0: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
f000: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
f010: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
f020: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f030: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f040: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
f050: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
f060: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
f070: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
f080: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
f090: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
f0a0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
f0b0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
f0c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
f0d0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
f0e0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
f0f0: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
f100: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
f110: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
f120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
f130: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f140: 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35  E-OF: R-07291-35
f150: 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35  328 A value of 5
f160: 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68   (0x05) means th
f170: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
f180: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62   ** interior tab
f190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
f1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
f1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
f1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f1e0: 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36  F: R-26900-09176
f1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28   A value of 13 (
f200: 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0d) means the 
f210: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
f220: 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72   leaf table b-tr
f230: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f240: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
f250: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
f260: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29  |PTF_LEAF)==13 )
f270: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f280: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Key = 1;.    if(
f290: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
f2a0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f2b0: 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20  KeyLeaf = 1;.   
f2c0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f2d0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f2e0: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
f2f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
f300: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f310: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
f320: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
f330: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
f340: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
f350: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
f360: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
f370: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
f380: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f390: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
f3a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
f3b0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
f3c0: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
f3d0: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
f3e0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
f3f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f400: 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76  -43316-37308 A v
f410: 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29  alue of 2 (0x02)
f420: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
f430: 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
f440: 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  erior index b-tr
f450: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f460: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
f470: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
f480: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f490: 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41   R-59615-42828 A
f4a0: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78   value of 10 (0x
f4b0: 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0a) means the pa
f4c0: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
f4d0: 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65  eaf index b-tree
f4e0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f4f0: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
f500: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
f510: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
f520: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
f530: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
f540: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
f550: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f560: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f570: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
f580: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
f590: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
f5a0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
f5b0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
f5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f5d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f5e0: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
f5f0: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
f600: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
f610: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
f620: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
f630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f640: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
f650: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
f660: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
f670: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
f680: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
f690: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f6a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
f6b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
f6c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
f6d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
f6e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
f6f0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
f700: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
f710: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
f720: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
f730: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
f740: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
f750: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
f760: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
f770: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
f780: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
f790: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
f7a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
f7b0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
f7c0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
f7d0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
f7e0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
f7f0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
f800: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
f810: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
f820: 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  age){.  int pc; 
f830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f840: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
f850: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
f860: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
f870: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
f880: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
f890: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
f8a0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
f8b0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
f8c0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
f8d0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
f8e0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f8f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
f900: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
f910: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
f920: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
f930: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
f940: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
f950: 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  */.  u16 cellOff
f960: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
f970: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
f980: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
f990: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
f9a0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
f9b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f9c0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
f9d0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
f9e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
f9f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
fa00: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
fa10: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
fa20: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
fa30: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
fa40: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
fa50: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
fa60: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
fa70: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
fa80: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
fa90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
faa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
fab0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
fac0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fad0: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
fae0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
faf0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
fb00: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fb10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fb20: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
fb30: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
fb40: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
fb50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
fb60: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
fb70: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
fb80: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fb90: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
fba0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
fbb0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
fbc0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
fbd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
fbe0: 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nit==0 );..  pBt
fbf0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
fc00: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
fc10: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
fc20: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fc30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
fc40: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
fc50: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
fc60: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
fc70: 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  dicating.  ** th
fc80: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
fc90: 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63  pe. */.  if( dec
fca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
fcb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20  data[hdr]) ){.  
fcc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fcd0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
fce0: 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
fcf0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
fd00: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
fd10: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
fd20: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
fd30: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
fd40: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
fd50: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
fd60: 77 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  w = 0;.  usableS
fd70: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
fd80: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
fd90: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
fda0: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
fdb0: 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  8 + pPage->child
fdc0: 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  PtrSize;.  pPage
fdd0: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
fde0: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
fdf0: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
fe00: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
fe10: 66 73 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  fset];.  pPage->
fe20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
fe30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
fe40: 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49  rSize];.  /* EVI
fe50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
fe60: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
fe70: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
fe80: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
fe90: 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  tes.  ** the sta
fea0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  rt of the cell c
feb0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a  ontent area. A z
fec0: 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ero value for th
fed0: 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20  is integer is.  
fee0: 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ** interpreted a
fef0: 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f  s 65536. */.  to
ff00: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ff10: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ff20: 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
ff30: 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37  -OF: R-37002-327
ff40: 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  74 The two-byte 
ff50: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
ff60: 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 3 gives the.  
ff70: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  ** number of cel
ff80: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ls on the page. 
ff90: 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  */.  pPage->nCel
ffa0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
ffb0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66  ta[hdr+3]);.  if
ffc0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
ffd0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
ffe0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
fff0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
10000 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
10010 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
10020 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
10030 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10040 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
10050 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
10060 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
10070 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56  (pBt) );.  /* EV
10080 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
10090 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61  89-57979 If a pa
100a0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
100b0 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f  ells (which is o
100c0 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c  nly.  ** possibl
100d0 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
100e0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
100f0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
10100 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ws) then the.  *
10110 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * offset to the 
10120 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
10130 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65  a will equal the
10140 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73   page size minus
10150 20 74 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20   the.  ** bytes 
10160 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
10170 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
10180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
10190 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
101a0 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
101b0 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  );..  /* A malfo
101c0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
101d0 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
101e0 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
101f0 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70  he end.  ** of p
10200 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  age when parsing
10210 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a   a cell.  .  **.
10220 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
10230 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
10240 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
10250 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
10260 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74  xtends.  ** past
10270 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
10280 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
10290 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
102a0 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 2a  RRUPT to be .  *
102b0 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  * returned if it
102c0 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43   does..  */.  iC
102d0 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
102e0 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
102f0 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  >nCell;.  iCellL
10300 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
10310 20 2d 20 34 3b 0a 20 20 69 66 28 20 70 42 74 2d   - 4;.  if( pBt-
10320 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
10330 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29  ITE_CellSizeCk )
10340 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
10350 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10360 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
10370 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
10380 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
10390 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
103a0 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
103b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
103c0 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
103d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
103e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
103f0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 67 65  ){.      pc = ge
10400 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
10410 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
10420 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  *2]);.      test
10430 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
10440 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65  irst );.      te
10450 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
10460 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 69  lLast );.      i
10470 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10480 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
10490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
104a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
104b0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
104c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20       }.      sz 
104d0 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
104e0 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
104f0 70 63 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  pc]);.      test
10500 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
10510 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
10520 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
10530 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10550 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10560 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10570 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
10580 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10590 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  st++;.  }  ..  /
105a0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
105b0 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
105c0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
105d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
105e0 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
105f0 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10600 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
10610 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74  s the.  ** start
10620 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72   of the first fr
10630 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  eeblock on the p
10640 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20  age, or is zero 
10650 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
10660 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
10670 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62   */.  pc = get2b
10680 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
10690 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74  );.  nFree = dat
106a0 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20  a[hdr+7] + top; 
106b0 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74   /* Init nFree t
106c0 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20  o non-freeblock 
106d0 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  free space */.  
106e0 69 66 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  if( pc>0 ){.    
106f0 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u32 next, size;.
10700 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
10710 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f  First ){.      /
10720 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10730 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
10740 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
10750 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
10760 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61   will.      ** a
10770 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61 73  lways be at leas
10780 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72  t one cell befor
10790 65 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  e the first free
107a0 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  block..      */.
107b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
107c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
107d0 28 70 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a  (pPage); .    }.
107e0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
107f0 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65        if( pc>iCe
10800 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10810 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f    /* Freeblock o
10820 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
10830 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
10840 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10850 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10860 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
10870 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
10880 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
10890 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
108a0 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
108b0 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d  );.      nFree =
108c0 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
108d0 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70       if( next<=p
108e0 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b  c+size+3 ) break
108f0 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
10900 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
10910 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20   next>0 ){.     
10920 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f   /* Freeblock no
10930 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
10940 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rder */.      re
10950 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10960 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10980 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64  c+size>(unsigned
10990 20 69 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20   int)usableSize 
109a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74  ){.      /* Last
109b0 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e   freeblock exten
109c0 64 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64  ds past page end
109d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
109e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
109f0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10a00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20   }.  }..  /* At 
10a10 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
10a20 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
10a30 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
10a40 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
10a50 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
10a60 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
10a70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
10a80 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
10a90 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63  .  ** the cell-c
10aa0 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
10ab0 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
10ac0 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
10ad0 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
10ae0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
10af0 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
10b00 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
10b10 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72  ck also.  ** ser
10b20 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
10b30 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
10b40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10b50 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
10b60 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
10b70 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
10b80 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
10b90 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
10ba0 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75  */.  if( nFree>u
10bb0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
10bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10bd0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10be0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
10bf0 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
10c00 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
10c10 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  t);.  pPage->isI
10c20 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  nit = 1;.  retur
10c30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10c40 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
10c50 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
10c60 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
10c70 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
10c80 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
10c90 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
10ca0 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
10cb0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
10cc0 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
10cd0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
10ce0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10cf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10d00 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
10d10 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
10d20 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
10d30 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
10d40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
10d50 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
10d60 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
10d70 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
10d80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
10d90 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10da0 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
10db0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
10dc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
10dd0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
10de0 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
10df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10e00 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
10e10 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
10e20 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10e30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10e40 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10e50 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
10e60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
10e70 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
10e80 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
10e90 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
10ea0 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
10eb0 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
10ec0 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
10ed0 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
10ee0 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
10ef0 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
10f00 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10f10 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
10f20 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
10f30 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10f40 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
10f50 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
10f60 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10f70 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
10f80 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
10f90 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
10fa0 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
10fb0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
10fc0 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
10fd0 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
10fe0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
10ff0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
11000 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
11010 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
11020 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
11030 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11040 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
11050 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
11060 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
11070 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
11080 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
11090 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
110a0 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
110b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
110c0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
110d0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
110e0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
110f0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
11100 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
11110 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
11120 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
11130 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
11140 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
11150 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
11160 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11170 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
11180 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
11190 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
111a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
111b0 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
111c0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
111d0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
111e0 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
111f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
11200 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
11210 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11220 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
11230 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
11240 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
11250 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
11260 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
11270 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
11280 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
11290 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
112a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
112b0 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
112c0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
112d0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
112e0 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
112f0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11300 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
11310 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
11320 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
11330 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
11340 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
11350 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
11360 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
11370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
11380 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
11390 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
113a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
113b0 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
113c0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
113d0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
113e0 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
113f0 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
11400 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
11410 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
11420 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
11430 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
11440 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
11450 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
11460 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
11470 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
11480 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
11490 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
114a0 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
114b0 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
114c0 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
114d0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
114e0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
114f0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
11500 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
11510 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
11520 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
11530 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
11540 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
11550 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
11560 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
11570 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
11580 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
11590 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
115a0 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
115b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
115c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
115d0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
115e0 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
115f0 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
11600 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
11610 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
11620 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
11630 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
11640 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
11650 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
11660 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
11670 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11680 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11690 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
116a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
116b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
116c0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
116d0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
116e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
116f0 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
11700 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
11710 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
11720 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
11730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11740 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
11750 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
11760 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
11770 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
11780 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
11790 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
117a0 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
117b0 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
117c0 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
117d0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
117e0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
117f0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
11800 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
11810 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
11820 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
11830 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
11840 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
11850 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11860 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11870 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
11880 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
11890 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
118a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
118b0 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
118c0 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
118d0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
118e0 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
118f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11900 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11910 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11920 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
11930 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
11940 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
11950 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
11960 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
11970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
11980 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
11990 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
119a0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
119b0 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
119c0 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
119d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
119e0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
119f0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
11a00 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
11a10 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
11a20 30 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  0000000)==0 );. 
11a30 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
11a40 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
11a50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
11a60 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
11a70 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
11a80 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  e it..**.** If p
11a90 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Cur!=0 then the 
11aa0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65  page is being fe
11ab0 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66  tched as part of
11ac0 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
11ad0 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64  .** call.  Do ad
11ae0 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20  ditional sanity 
11af0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
11b00 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
11b10 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  e..** And if the
11b20 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68   fetch fails, th
11b30 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
11b40 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e  decrement pCur->
11b50 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iPage..**.** The
11b60 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64   page is fetched
11b70 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75   as read-write u
11b80 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f  nless pCur is no
11b90 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a  t NULL and is.**
11ba0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
11bb0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  sor..**.** If an
11bc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
11bd0 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75  hen *ppPage is u
11be0 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20  ndefined. It.** 
11bf0 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61  may remain uncha
11c00 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20  nged, or it may 
11c10 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76  be set to an inv
11c20 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  alid value..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
11c40 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
11c50 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
11c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11c80 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11cb0 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
11cc0 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
11cd0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
11ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11cf0 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
11d00 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75  r here */.  BtCu
11d10 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
11d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11d30 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65  ursor to receive
11d40 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55   the page, or NU
11d50 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  LL */.  int bRea
11d60 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  dOnly           
11d70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11d80 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
11d90 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
11da0 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
11db0 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
11dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11dd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
11df0 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d  ur==0 || ppPage=
11e00 3d 26 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  =&pCur->pPage );
11e10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
11e20 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d  =0 || bReadOnly=
11e30 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46  =pCur->curPagerF
11e40 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74  lags );.  assert
11e50 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75  ( pCur==0 || pCu
11e60 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20  r->iPage>0 );.. 
11e70 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
11e80 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
11e90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11ea0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11eb0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11ec0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11ed0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11ee0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
11ef0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
11f00 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
11f10 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66  bReadOnly);.  if
11f20 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ( rc ){.    goto
11f30 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
11f40 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70  error;.  }.  *pp
11f50 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
11f60 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
11f70 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
11f80 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
11f90 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
11fa0 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44    btreePageFromD
11fb0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
11fc0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72  gno, pBt);.    r
11fd0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
11fe0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
11ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12000 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
12010 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
12020 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41  .      goto getA
12030 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
12040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
12050 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
12060 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
12070 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
12080 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  e)->aData==sqlit
12090 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
120a0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
120b0 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
120c0 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
120d0 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
120e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
120f0 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
12100 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
12110 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
12120 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28    if( pCur && ((
12130 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
12140 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
12150 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
12160 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20  rIntKey) ){.    
12170 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12180 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a  UPT_PGNO(pgno);.
12190 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
121a0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f  *ppPage);.    go
121b0 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
121c0 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
121d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
121e0 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  ..getAndInitPage
121f0 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43  _error:.  if( pC
12200 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ur ){.    pCur->
12210 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75  iPage--;.    pCu
12220 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
12230 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
12240 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age];.  }.  test
12250 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
12260 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
12270 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
12280 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
12290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
122a0 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
122b0 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
122c0 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
122d0 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
122e0 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
122f0 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  GetPage..**.** P
12300 61 67 65 31 20 69 73 20 61 20 73 70 65 63 69 61  age1 is a specia
12310 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20  l case and must 
12320 62 65 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  be released usin
12330 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  g releasePageOne
12340 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
12350 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
12360 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
12370 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
12380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
12390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
123a0 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
123b0 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
123c0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
123d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
123e0 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
123f0 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
12400 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
12410 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
12420 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
12430 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
12440 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12450 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12460 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12470 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
12480 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
12490 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
124a0 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
124b0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
124c0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
124d0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
124e0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
124f0 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74  ull(pPage);.}.st
12500 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
12510 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
12520 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
12530 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
12540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12550 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
12560 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
12570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12580 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
12590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
125a0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
125b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
125c0 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
125d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
125e0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
125f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
12600 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
12610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12620 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12630 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
12640 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
12650 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
12660 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
12670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
12680 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
12690 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
126a0 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
126b0 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
126c0 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
126d0 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
126e0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
126f0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
12700 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
12710 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
12720 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
12730 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
12740 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
12750 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
12760 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
12770 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
12780 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
12790 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
127a0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
127b0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
127c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
127d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
127e0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
127f0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
12800 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
12810 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12820 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
12830 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
12840 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12850 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12860 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12870 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12880 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12890 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
128a0 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
128b0 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
128c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
128d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
128e0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
128f0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
12900 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
12910 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
12920 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
12930 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
12940 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12950 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12960 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12970 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12980 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12990 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
129a0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
129b0 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
129c0 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
129d0 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
129e0 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
129f0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
12a00 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
12a10 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
12a20 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
12a30 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
12a40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
12a50 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12a60 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12a70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a90 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12aa0 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12ab0 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
12ac0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
12ad0 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
12ae0 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
12af0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
12b00 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
12b10 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
12b20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
12b30 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
12b40 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
12b50 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12b60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12b70 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12b80 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12b90 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12ba0 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12bb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12bc0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12bd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12be0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12bf0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12c00 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12c10 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
12c20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
12c30 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
12c40 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12c50 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12c60 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12c70 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12c80 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12c90 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12ca0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12cb0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12cc0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12cd0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12ce0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12cf0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
12d00 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
12d10 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
12d20 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
12d30 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
12d40 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12d50 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12d60 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12d70 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12d80 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12d90 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12da0 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12db0 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12dc0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12dd0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12de0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
12df0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12e00 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
12e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12e20 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
12e30 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
12e40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12e50 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12e60 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12e70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12e80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12e90 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12ea0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12eb0 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12ec0 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12ed0 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12ee0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
12ef0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
12f00 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
12f10 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
12f20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12f30 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
12f40 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
12f50 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
12f60 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12f70 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
12f80 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
12f90 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
12fa0 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
12fb0 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
12fc0 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
12fd0 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
12fe0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
12ff0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
13000 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
13010 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
13020 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
13030 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
13040 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
13050 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
13060 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
13070 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
13080 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
13090 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
130a0 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
130b0 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
130c0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
130d0 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
130e0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
130f0 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
13100 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
13110 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
13120 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
13130 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
13140 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
13150 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
13160 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
13170 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
13180 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
13190 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
131a0 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
131b0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
131c0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
131d0 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
131e0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
131f0 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
13200 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
13210 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
13220 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
13230 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
13240 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
13250 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
13260 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
13270 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
13280 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13290 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
132a0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
132b0 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
132c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
132d0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
132e0 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
132f0 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
13300 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
13310 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
13320 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
13330 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13340 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
13350 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
13360 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
13370 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
13380 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
13390 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
133a0 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
133b0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
133c0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
133d0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
133e0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
133f0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
13400 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
13410 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
13420 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
13430 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
13440 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
13450 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
13470 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
13480 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13490 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
134a0 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
134b0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
134c0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
134d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
134e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
134f0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
13500 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
13510 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
13520 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
13530 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
13540 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
13550 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
13560 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
13570 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
13580 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
13590 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
135a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
135b0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
135c0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
135d0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
135e0 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
135f0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
13600 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
13610 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
13620 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
13630 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
13640 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
13650 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
13660 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
13670 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
13680 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13690 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
136a0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
136b0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
136c0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
136d0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
136e0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
136f0 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
13700 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
13710 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
13720 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
13730 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
13740 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
13750 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
13760 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13770 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
13780 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
13790 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
137a0 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
137b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
137c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
137d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
137e0 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
137f0 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
13800 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
13810 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
13820 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
13830 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
13840 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
13850 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
13860 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
13870 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
13880 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13890 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
138a0 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
138b0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
138c0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
138d0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
138e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
138f0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
13900 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
13910 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
13920 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
13930 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
13940 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
13950 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
13960 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
13970 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
13980 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
13990 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
139a0 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
139b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
139c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
139d0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
139e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
139f0 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
13a00 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
13a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13a20 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
13a30 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
13a40 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
13a50 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
13a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13a70 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
13a80 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
13a90 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
13aa0 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
13ab0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13ac0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13ad0 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
13ae0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
13af0 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
13b00 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
13b10 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
13b20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
13b30 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
13b40 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
13b50 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
13b60 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
13b70 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  h.  */.  if( isT
13b80 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d  empDb==0 && (isM
13b90 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46  emdb==0 || (vfsF
13ba0 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
13bb0 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20  _URI)!=0) ){.   
13bc0 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20   if( vfsFlags & 
13bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
13be0 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20  EDCACHE ){.     
13bf0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d   int nFilename =
13c00 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
13c10 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20  (zFilename)+1;. 
13c20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
13c30 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
13c40 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
13c50 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
13c60 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
13c70 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c  Malloc(MAX(nFull
13c80 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61  Pathname,nFilena
13c90 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  me));.      MUTE
13ca0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
13cb0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
13cc0 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d  red; )..      p-
13cd0 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
13ce0 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
13cf0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
13d00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13d10 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
13d20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
13d30 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
13d40 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
13d50 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
13d60 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
13d70 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
13d80 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
13d90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13da0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
13db0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
13dc0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
13df0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
13e00 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
13e10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13e30 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
13e40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
13e50 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13e60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13e70 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13e80 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
13e90 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
13ea0 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
13eb0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13ec0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
13ed0 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
13ee0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
13ef0 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
13f00 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
13f10 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
13f20 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13f30 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
13f40 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
13f50 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
13f60 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
13f70 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
13f80 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
13f90 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13fa0 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
13fb0 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
13fc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13fd0 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
13fe0 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
13ff0 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
14000 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
14010 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
14020 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
14030 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
14040 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
14050 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
14060 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
14070 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
14080 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
14090 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
140a0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
140b0 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
140c0 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
140d0 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
140e0 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
140f0 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
14100 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
14110 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14120 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14130 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14150 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14160 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
14170 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14180 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
14190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
141a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
141b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
141c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
141d0 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
141e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
141f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
14200 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
14210 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
14220 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
14230 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
14240 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14250 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14260 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14270 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14280 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
14290 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
142a0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
142b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
142c0 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
142d0 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
142e0 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
142f0 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
14300 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
14310 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
14320 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
14330 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
14340 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
14350 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
14360 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
14370 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
14380 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
14390 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
143a0 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
143b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
143c0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
143d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
143e0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
143f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
14400 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
14410 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
14420 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
14430 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
14440 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
14450 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
14460 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
14470 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
14480 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
14490 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
144a0 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
144b0 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
144c0 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
144d0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
144e0 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
144f0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14500 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
14510 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
14520 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
14530 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
14540 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
14550 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
14560 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
14570 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
14580 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
14590 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
145a0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
145b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
145c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
145d0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
145e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
145f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
14600 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
14610 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
14620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14630 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
14640 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67  f(MemPage), flag
14650 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
14660 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
14670 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14680 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14690 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
146a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
146b0 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
146c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
146d0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
146e0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
146f0 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
14700 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
14710 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
14720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14730 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
14740 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
14750 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
14760 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
14770 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
14780 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
14790 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
147a0 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
147b0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
147c0 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
147d0 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
147e0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
147f0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
14800 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
14810 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
14820 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
14830 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
14840 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
14850 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65  ONLY;.#if define
14860 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  d(SQLITE_SECURE_
14870 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d  DELETE).    pBt-
14880 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14890 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
148a0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
148b0 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45  LITE_FAST_SECURE
148c0 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74  _DELETE).    pBt
148d0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
148e0 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e  S_OVERWRITE;.#en
148f0 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  dif.    /* EVIDE
14900 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
14910 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
14920 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
14930 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
14940 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
14950 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
14960 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
14970 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
14980 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
14990 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
149a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
149b0 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  le. */.    pBt->
149c0 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
149d0 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
149e0 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
149f0 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
14a00 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
14a10 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
14a20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
14a30 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
14a40 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
14a50 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
14a60 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
14a70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
14a80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14a90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14aa0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
14ab0 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
14ac0 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
14ad0 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
14ae0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
14af0 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
14b00 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
14b10 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
14b20 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
14b30 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
14b40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
14b50 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
14b60 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
14b70 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
14b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
14b90 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
14ba0 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
14bb0 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
14bc0 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
14bd0 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
14be0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
14bf0 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
14c00 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
14c10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14c20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
14c30 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
14c40 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
14c50 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
14c60 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
14c70 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
14c80 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
14c90 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
14ca0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
14cb0 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
14cc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14cd0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
14ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14cf0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
14d00 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
14d10 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
14d20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
14d30 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  is.      ** dete
14d40 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
14d50 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
14d60 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
14d70 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
14d80 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  .      ** into t
14d90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14da0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
14db0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
14dc0 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
14dd0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
14de0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
14df0 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
14e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14e10 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
14e20 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
14e30 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
14e40 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
14e50 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
14e60 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
14e70 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
14e80 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
14e90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
14ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14eb0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
14ec0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
14ed0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
14ee0 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
14ef0 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
14f00 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
14f10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
14f20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
14f30 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
14f40 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
14f50 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
14f60 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
14f70 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
14f80 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
14f90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14fa0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
14fb0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14fc0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
14fd0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
14fe0 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
14ff0 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
15000 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
15010 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
15020 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
15030 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  1;.    if( p->sh
15040 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
15050 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
15060 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
15070 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
15080 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75   MUTEX_LOGIC( mu
15090 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
150a0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
150b0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
150c0 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20  C_MASTER);).    
150d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
150e0 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
150f0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
15100 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
15110 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
15120 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
15130 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15140 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
15150 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
15160 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
15170 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15180 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
15190 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
151a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
151b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
151c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
151d0 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
151e0 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
151f0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
15200 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15210 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
15220 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
15230 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15240 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
15250 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
15260 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
15270 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
15280 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
15290 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
152a0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
152b0 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
152c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
152d0 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
152e0 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
152f0 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
15300 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
15310 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
15320 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
15330 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
15340 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
15350 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
15360 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
15370 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
15380 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
15390 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
153a0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
153b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
153c0 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
153d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
153e0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
153f0 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
15400 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
15410 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
15420 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
15430 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
15440 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
15450 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
15460 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e     if( (uptr)p->
15470 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e  pBt<(uptr)pSib->
15480 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
15490 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
154a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
154b0 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
154c0 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
154d0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
154e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
154f0 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
15500 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e   && (uptr)pSib->
15510 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72  pNext->pBt<(uptr
15520 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  )p->pBt ){.     
15530 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
15540 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
15550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15560 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
15570 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
15580 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
15590 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
155a0 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
155b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
155c0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
155d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
155e0 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
155f0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
15600 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15610 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15620 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
15630 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
15640 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
15650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15660 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
15670 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
15680 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15690 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
156a0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
156b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
156c0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
156d0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
156e0 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  Btree = 0;.  }el
156f0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
15700 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20  file *pFile;..  
15710 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
15720 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
15730 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
15740 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
15750 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
15760 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
15770 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
15780 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
15790 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
157a0 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
157b0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
157c0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
157d0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
157e0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
157f0 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
15800 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
15810 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
15820 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
15830 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
15840 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
15850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c  .    }..    pFil
15860 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
15870 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
15880 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
15890 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
158a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
158b0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69  eControlHint(pFi
158c0 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  le, SQLITE_FCNTL
158d0 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42  _PDB, (void*)&pB
158e0 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  t->db);.    }.  
158f0 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
15900 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
15910 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15920 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
15930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
15940 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
15950 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  pen);.  }.  asse
15960 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
15970 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  K || sqlite3Btre
15980 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74  eConnectionCount
15990 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a  (*ppBtree)>0 );.
159a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
159b0 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
159c0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
159d0 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
159e0 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
159f0 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
15a00 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
15a10 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
15a20 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
15a30 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
15a40 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
15a50 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
15a60 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
15a70 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
15a80 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
15a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
15aa0 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
15ab0 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
15ac0 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
15ad0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15ae0 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
15af0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
15b00 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
15b10 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
15b20 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
15b30 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
15b40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
15b50 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
15b60 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
15b70 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
15b80 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15b90 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15ba0 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
15bb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15bc0 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
15bd0 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
15be0 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
15bf0 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
15c00 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15c10 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15c20 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
15c30 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
15c40 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15c50 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
15c60 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
15c70 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
15c80 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
15c90 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15ca0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
15cb0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
15cc0 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
15cd0 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
15ce0 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
15cf0 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
15d00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
15d10 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
15d20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
15d30 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
15d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15d50 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
15d60 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
15d70 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15d80 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
15d90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
15da0 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
15db0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15dc0 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
15dd0 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
15de0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
15df0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
15e00 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
15e10 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
15e20 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
15e30 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
15e40 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
15e50 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20  s with a 4-byte 
15e60 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66  prefix for a lef
15e70 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74  t-child.** point
15e80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
15e90 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
15ea0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
15eb0 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
15ec0 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
15ed0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
15ee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
15ef0 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
15f00 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  ize );..    /* O
15f10 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f  ne of the uses o
15f20 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  f pBt->pTmpSpace
15f30 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65   is to format ce
15f40 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lls before.    *
15f50 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d  * inserting them
15f60 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67   into a leaf pag
15f70 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  e (function fill
15f80 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20  InCell()). If.  
15f90 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c    ** a cell is l
15fa0 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73  ess than 4 bytes
15fb0 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20   in size, it is 
15fc0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
15fd0 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20  bytes.    ** by 
15fe0 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74  the various rout
15ff0 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75  ines that manipu
16000 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c  late binary cell
16010 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20  s. Which.    ** 
16020 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69  can mean that fi
16030 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
16040 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
16050 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20  first 2 or 3.   
16060 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d   ** bytes of pTm
16070 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74  pSpace, but that
16080 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16090 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  es are copied fr
160a0 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  om.    ** it int
160b0 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  o a database pag
160c0 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  e. This is not a
160d0 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65  ctually a proble
160e0 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a  m, but it.    **
160f0 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61   does cause a va
16100 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65  lgrind error whe
16110 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74  n the 1 or 2 byt
16120 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65  es of unitialize
16130 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  d .    ** data i
16140 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74  s passed to syst
16150 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e  em call write().
16160 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69   So to avoid thi
16170 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20  s error,.    ** 
16180 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34  zero the first 4
16190 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73   bytes of temp s
161a0 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a  pace here..    *
161b0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20  *.    ** Also:  
161c0 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74  Provide four byt
161d0 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65  es of initialize
161e0 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74  d space before t
161f0 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e  he.    ** beginn
16200 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65  ing of pTmpSpace
16210 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69   as an area avai
16220 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64  lable to prepend
16230 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
16240 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74  -child pointer t
16250 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
16260 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a  of a cell..    *
16270 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
16280 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
16290 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54    memset(pBt->pT
162a0 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a  mpSpace, 0, 8);.
162b0 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
162c0 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d  pace += 4;.    }
162d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
162e0 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
162f0 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
16300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16310 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
16320 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
16330 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
16340 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
16350 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20  TmpSpace -= 4;. 
16360 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
16370 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ee(pBt->pTmpSpac
16380 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d  e);.    pBt->pTm
16390 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  pSpace = 0;.  }.
163a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
163b0 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
163c0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
163d0 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
163e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
163f0 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
16400 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16410 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
16420 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
16430 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
16440 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
16450 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
16460 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16470 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16480 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16490 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
164a0 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
164b0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
164c0 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
164d0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
164e0 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
164f0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
16500 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
16510 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
16520 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
16530 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
16540 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16550 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
16560 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
16570 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
16580 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
16590 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
165a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
165b0 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
165c0 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
165d0 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
165e0 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
165f0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
16600 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
16610 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  , 0);.  sqlite3B
16620 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
16630 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
16640 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
16650 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
16660 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
16670 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
16680 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
16690 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
166a0 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
166b0 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
166c0 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
166d0 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
166e0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
166f0 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
16700 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
16710 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
16720 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
16730 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
16740 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
16750 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
16760 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
16770 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
16780 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
16790 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
167a0 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
167b0 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
167c0 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
167d0 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
167e0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
167f0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
16800 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
16810 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
16820 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29  ->pPager, p->db)
16830 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
16840 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
16850 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
16860 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
16870 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
16880 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
16890 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
168a0 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
168b0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
168c0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
168d0 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
168e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
168f0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16900 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
16910 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
16920 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
16930 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
16940 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
16950 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
16960 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
16970 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
16980 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
16990 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
169a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
169b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
169c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
169d0 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c  nge the "soft" l
169e0 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
169f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
16a00 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75  he cache..** Unu
16a10 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69  sed and unmodifi
16a20 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  ed pages will be
16a30 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74   recycled when t
16a40 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
16a50 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
16a60 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20  he exceeds this 
16a70 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74  soft limit.  But
16a80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
16a90 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c  .** cache is all
16aa0 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72  owed to grow lar
16ab0 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69  ger than this li
16ac0 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69  mit if it contai
16ad0 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  ns.** dirty page
16ae0 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c  s or pages still
16af0 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a   in active use..
16b00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16b10 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
16b20 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
16b30 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
16b40 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16b50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16b60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
16b70 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
16b80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16b90 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
16ba0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
16bb0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
16bc0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
16bd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16bf0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
16c00 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20  nge the "spill" 
16c10 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
16c20 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
16c30 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66  the cache..** If
16c40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16c50 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69  ages exceeds thi
16c60 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61  s limit during a
16c70 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
16c80 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  on,.** the pager
16c90 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74   might attempt t
16ca0 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20  o "spill" pages 
16cb0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  to the journal e
16cc0 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  arly in.** order
16cd0 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f   to free up memo
16ce0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ry..**.** The va
16cf0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
16d00 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c  the current spil
16d10 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f  l size.  If zero
16d20 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73   is passed.** as
16d30 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f   an argument, no
16d40 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
16d50 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73  e to the spill s
16d60 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a  ize setting, so.
16d70 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20  ** using mxPage 
16d80 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f  of 0 is a way to
16d90 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65   query the curre
16da0 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a  nt spill size..*
16db0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16dc0 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42  eeSetSpillSize(B
16dd0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
16de0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
16df0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16e00 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
16e10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16e20 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16e30 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16e40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16e50 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
16e60 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
16e70 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
16e80 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
16e90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16ea0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
16eb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
16ec0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
16ed0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
16ee0 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
16ef0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16f00 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
16f10 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
16f20 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16f30 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
16f40 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
16f50 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
16f60 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
16f70 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16f80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16f90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16fa0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16fb0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16fc0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16fd0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
16fe0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
16ff0 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
17000 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17020 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
17030 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
17040 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
17050 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
17060 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
17070 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
17080 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
17090 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
170a0 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
170b0 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
170c0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
170d0 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
170e0 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
170f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
17100 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
17110 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
17120 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
17130 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
17140 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
17150 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
17160 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
17170 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
17180 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
17190 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
171a0 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
171b0 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
171c0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
171d0 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
171e0 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
171f0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
17200 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
17210 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
17220 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
17230 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
17240 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
17250 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17260 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
17270 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
17280 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
17290 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
172a0 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
172b0 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
172c0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
172d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
172e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
172f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
17300 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
17310 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17320 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
17330 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
17340 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
17350 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17360 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17380 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
17390 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
173a0 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
173b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
173c0 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
173d0 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
173e0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
173f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
17400 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
17410 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
17420 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
17430 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
17440 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
17450 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
17460 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
17470 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
17480 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
17490 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
174a0 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
174b0 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
174c0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
174d0 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
174e0 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
174f0 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
17500 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
17510 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
17520 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
17530 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17540 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
17550 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
17560 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
17570 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
17580 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
17590 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
175a0 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
175b0 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
175c0 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
175d0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
175e0 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
175f0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
17600 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
17610 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
17620 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
17630 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
17640 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
17650 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54  x!=0 then the BT
17660 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
17670 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
17680 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
17690 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
176a0 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
176b0 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
176c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
176d0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
176e0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
176f0 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
17700 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
17710 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
17720 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
17730 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17740 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
17750 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
17760 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
17770 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17780 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54  er(p);.#if SQLIT
17790 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
177a0 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e  ( nReserve>pBt->
177b0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
177c0 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73   pBt->optimalRes
177d0 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65  erve = (u8)nRese
177e0 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rve;.#endif.  if
177f0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
17800 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
17810 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  IXED ){.    sqli
17820 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17830 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17840 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
17850 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
17860 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
17870 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
17880 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
17890 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
178a0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
178b0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
178c0 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
178d0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
178e0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
178f0 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
17900 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
17910 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
17920 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
17930 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
17940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17950 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
17960 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
17970 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
17980 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
17990 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
179a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
179b0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
179c0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
179d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
179e0 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
179f0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
17a00 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
17a10 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
17a20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46  iFix ) pBt->btsF
17a30 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
17a40 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71  SIZE_FIXED;.  sq
17a50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17a60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17a80 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
17a90 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
17aa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17ab0 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
17ac0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
17ad0 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
17ae0 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
17af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17b00 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
17b10 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
17b20 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
17b30 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
17b40 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
17b50 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
17b60 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
17b70 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
17b80 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
17b90 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
17ba0 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
17bb0 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
17bc0 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
17bd0 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
17be0 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
17bf0 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
17c00 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
17c10 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
17c20 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
17c30 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
17c40 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
17c50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17c60 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
17c70 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
17c80 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
17c90 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
17ca0 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
17cb0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
17cc0 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
17cd0 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
17ce0 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
17cf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
17d00 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
17d10 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
17d20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
17d30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17d40 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
17d50 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
17d60 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
17d70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
17d80 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
17d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
17da0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
17db0 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
17dc0 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
17dd0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
17de0 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
17df0 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
17e00 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
17e10 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
17e20 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
17e30 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a   extensions..**.
17e40 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53  ** If SQLITE_HAS
17e50 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65  _MUTEX is define
17e60 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d then the numbe
17e70 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  r returned is th
17e80 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20  e.** greater of 
17e90 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65  the current rese
17ea0 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74  rved space and t
17eb0 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65  he maximum reque
17ec0 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20  sted.** reserve 
17ed0 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  space..*/.int sq
17ee0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74  lite3BtreeGetOpt
17ef0 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65  imalReserve(Btre
17f00 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
17f10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17f20 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
17f30 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
17f40 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a  erveNoMutex(p);.
17f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
17f60 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c  S_CODEC.  if( n<
17f70 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
17f80 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e  eserve ) n = p->
17f90 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
17fa0 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rve;.#endif.  sq
17fb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17fc0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
17fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
17fe0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
17ff0 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
18000 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
18010 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
18020 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
18030 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
18040 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
18050 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
18060 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
18070 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
18080 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
18090 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
180a0 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
180b0 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
180c0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
180d0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
180e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
180f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
18100 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
18110 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
18120 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18130 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18140 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
18150 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
18160 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45  s for the BTS_SE
18170 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20  CURE_DELETE and 
18180 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c  BTS_OVERWRITE fl
18190 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65  ags:.**.**    ne
181a0 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42  wFlag==0       B
181b0 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44  oth BTS_SECURE_D
181c0 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56  ELETE and BTS_OV
181d0 45 52 57 52 49 54 45 20 61 72 65 20 63 6c 65 61  ERWRITE are clea
181e0 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  red.**    newFla
181f0 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53  g==1       BTS_S
18200 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74  ECURE_DELETE set
18210 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
18220 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a  TE is cleared.**
18230 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20      newFlag==2  
18240 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f       BTS_SECURE_
18250 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61  DELETE cleared a
18260 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
18270 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65   is set.**    ne
18280 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e  wFlag==(-1)    N
18290 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20  o changes.**.** 
182a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
182b0 73 20 61 73 20 61 20 71 75 65 72 79 20 69 66 20  s as a query if 
182c0 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20  newFlag is less 
182d0 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20  than zero.**.** 
182e0 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49  With BTS_OVERWRI
182f0 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20  TE set, deleted 
18300 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77  content is overw
18310 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c  ritten by zeros,
18320 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74   but.** freelist
18330 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
18340 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b  not written back
18350 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18360 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a  .  Thus in-page.
18370 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  ** deleted conte
18380 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62  nt is cleared, b
18390 75 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65  ut freelist dele
183a0 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ted content is n
183b0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42  ot..**.** With B
183c0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
183d0 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c  , operation is l
183e0 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54  ike BTS_OVERWRIT
183f0 45 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  E with the addit
18400 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65  ion.** that free
18410 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
18420 61 72 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b  are written back
18430 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18440 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a  se, increasing.*
18450 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  * the amount of 
18460 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74  disk I/O..*/.int
18470 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
18480 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
18490 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
184a0 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
184b0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
184c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
184d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
184e0 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54  rt( BTS_OVERWRIT
184f0 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45  E==BTS_SECURE_DE
18500 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65  LETE*2 );.  asse
18510 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43  rt( BTS_FAST_SEC
18520 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52  URE==(BTS_OVERWR
18530 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44  ITE|BTS_SECURE_D
18540 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20  ELETE) );.  if( 
18550 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
18560 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
18570 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f  gs &= ~BTS_FAST_
18580 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70  SECURE;.    p->p
18590 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
185a0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
185b0 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20  E*newFlag;.  }. 
185c0 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
185d0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
185e0 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45  T_SECURE)/BTS_SE
185f0 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73  CURE_DELETE;.  s
18600 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18610 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
18620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
18630 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
18640 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
18650 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
18660 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
18670 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
18680 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
18690 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
186a0 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
186b0 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
186c0 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
186d0 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
186e0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
186f0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
18700 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
18710 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18720 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
18730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18740 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
18750 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
18760 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
18770 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
18780 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
18790 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
187a0 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
187b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
187c0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
187d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
187e0 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
187f0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
18800 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18810 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
18820 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
18830 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
18840 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
18850 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
18860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
18870 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
18880 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
18890 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
188a0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
188b0 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
188c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
188d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
188e0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
188f0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
18900 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
18910 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
18920 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
18930 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
18940 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
18950 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
18960 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
18970 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
18980 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
18990 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
189a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
189b0 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
189c0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
189d0 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
189e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
189f0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
18a00 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
18a10 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
18a20 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
18a30 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
18a40 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
18a50 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
18a60 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
18a70 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
18a80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18a90 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18aa0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
18ab0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  /*.** If the use
18ac0 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68  r has not set th
18ad0 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66  e safety-level f
18ae0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
18af0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75   connection.** u
18b00 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e  sing "PRAGMA syn
18b10 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69  chronous", and i
18b20 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  f the safety-lev
18b30 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  el is not alread
18b40 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20  y.** set to the 
18b50 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  value passed to 
18b60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
18b70 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
18b80 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74  meter,.** set it
18b90 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49   so..*/.#if SQLI
18ba0 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
18bb0 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44  RONOUS!=SQLITE_D
18bc0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
18bd0 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26 20  RONOUS \.    && 
18be0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
18bf0 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69 63  OMIT_WAL).static
18c00 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c 74   void setDefault
18c10 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72 65  SyncFlag(BtShare
18c20 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65 74  d *pBt, u8 safet
18c30 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69  y_level){.  sqli
18c40 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 70  te3 *db;.  Db *p
18c50 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70 42  Db;.  if( (db=pB
18c60 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44  t->db)!=0 && (pD
18c70 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b  b=db->aDb)!=0 ){
18c80 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d  .    while( pDb-
18c90 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e  >pBt==0 || pDb->
18ca0 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b  pBt->pBt!=pBt ){
18cb0 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69 66   pDb++; }.    if
18cc0 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d  ( pDb->bSyncSet=
18cd0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62 2d  =0 .     && pDb-
18ce0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 73  >safety_level!=s
18cf0 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20 20  afety_level .   
18d00 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e 61    && pDb!=&db->a
18d10 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20 20  Db[1] .    ){.  
18d20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
18d30 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f 6c  level = safety_l
18d40 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  evel;.      sqli
18d50 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
18d60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20  (pBt->pPager,.  
18d70 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
18d80 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d  ety_level | (db-
18d90 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  >flags & PAGER_F
18da0 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20  LAGS_MASK));.   
18db0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
18dc0 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61 75   define setDefau
18dd0 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 73  ltSyncFlag(pBt,s
18de0 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65 6e  afety_level).#en
18df0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  dif../*.** Get a
18e00 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
18e10 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
18e20 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
18e30 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
18e40 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
18e50 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
18e60 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
18e70 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
18e80 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
18e90 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
18ea0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
18eb0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
18ec0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
18ed0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
18ee0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
18ef0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
18f00 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
18f10 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
18f20 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
18f30 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
18f40 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
18f50 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
18f60 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
18f70 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
18f80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
18f90 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
18fa0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
18fb0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
18fc0 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
18fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18fe0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
18ff0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19000 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19010 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
19020 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
19030 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
19040 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
19050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19060 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
19070 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
19080 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
19090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
190a0 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
190b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
190c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
190d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
190e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
190f0 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
19100 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
19110 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
19120 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
19130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19140 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
19150 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
19160 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
19170 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19180 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19190 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
191a0 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
191b0 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
191c0 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
191d0 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
191e0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
191f0 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
19200 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
19210 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
19220 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
19230 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
19240 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
19250 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
19260 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
19270 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
19280 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
19290 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
192a0 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
192b0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
192c0 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
192d0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
192e0 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
192f0 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
19300 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
19310 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
19320 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
19330 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
19340 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19350 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
19360 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
19370 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
19380 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
19390 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
193a0 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
193b0 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
193c0 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
193d0 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
193e0 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
193f0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
19400 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
19410 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
19420 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19430 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
19440 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
19450 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
19460 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
19470 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
19480 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
19490 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
194a0 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
194b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
194c0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
194d0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
194e0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
194f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
19500 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
19510 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
19520 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
19530 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
19540 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
19550 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19560 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
19570 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
19580 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
19590 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
195a0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
195b0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
195c0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
195d0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
195e0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
195f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19600 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
19610 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
19620 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
19630 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
19640 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
19650 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
19660 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
19670 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
19680 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
19690 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
196a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
196b0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
196c0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
196d0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
196e0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
196f0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
19700 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
19710 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19720 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
19730 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
19740 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
19750 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
19760 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
19770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19780 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
19790 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
197a0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
197b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
197c0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
197d0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
197e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
197f0 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79      setDefaultSy
19800 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49  ncFlag(pBt, SQLI
19810 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
19820 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20  YNCHRONOUS+1);. 
19830 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65         if( isOpe
19840 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
19850 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
19860 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
19870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19880 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
19890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
198a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
198b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
198c0 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
198d0 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
198e0 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
198f0 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a  ONOUS+1);.    }.
19900 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
19910 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
19920 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
19930 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
19940 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
19950 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
19960 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
19970 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
19980 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
19990 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
199a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
199b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
199c0 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
199d0 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
199e0 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
199f0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
19a00 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
19a10 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
19a20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
19a30 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
19a40 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
19a50 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
19a60 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19a70 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
19a80 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19a90 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
19aa0 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
19ab0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19ac0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19ad0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
19ae0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
19af0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
19b00 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
19b10 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
19b20 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
19b30 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
19b40 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
19b50 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
19b60 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
19b70 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19b80 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
19b90 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
19ba0 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
19bb0 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
19bc0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
19bd0 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
19be0 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
19bf0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
19c00 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
19c10 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
19c20 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
19c30 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
19c40 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
19c50 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19c60 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
19c70 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
19c80 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
19c90 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19ca0 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
19cb0 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
19cc0 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
19cd0 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
19ce0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
19cf0 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
19d00 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
19d10 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
19d20 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
19d30 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
19d40 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
19d50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
19d60 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
19d70 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
19d80 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
19d90 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
19da0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
19db0 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
19dc0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
19dd0 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
19de0 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
19df0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
19e00 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
19e10 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
19e20 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
19e30 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
19e40 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
19e50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
19e60 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
19e70 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
19e80 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
19e90 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
19ea0 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
19eb0 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
19ec0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
19ed0 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
19ee0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
19ef0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
19f00 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
19f10 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
19f20 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
19f30 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
19f40 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
19f50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
19f60 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
19f70 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
19f80 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
19f90 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
19fa0 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
19fb0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
19fc0 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
19fd0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
19fe0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19ff0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
1a000 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
1a010 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
1a020 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
1a030 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a040 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
1a050 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
1a060 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
1a070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
1a0a0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
1a0b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a0c0 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
1a0d0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1a0e0 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
1a0f0 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
1a100 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
1a110 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1a120 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
1a130 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a140 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1a150 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a160 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f  R-28312-64704 Ho
1a170 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c  wever, the usabl
1a180 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c  e size is not al
1a190 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  lowed to.    ** 
1a1a0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30  be less than 480
1a1b0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
1a1c0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
1a1d0 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20  ze is 512, then 
1a1e0 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72  the.    ** reser
1a1f0 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63  ved space size c
1a200 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e  annot exceed 32.
1a210 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62   */.    if( usab
1a220 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
1a230 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1a240 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1a250 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
1a260 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
1a270 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1a280 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1a290 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a2a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1a2b0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
1a2c0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
1a2d0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
1a2e0 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
1a2f0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
1a300 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
1a310 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
1a320 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
1a330 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
1a340 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
1a350 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
1a360 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
1a370 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
1a380 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
1a390 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
1a3a0 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
1a3b0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
1a3c0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
1a3d0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
1a3e0 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
1a3f0 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
1a400 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
1a410 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
1a420 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
1a430 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
1a440 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
1a450 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
1a460 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
1a470 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
1a480 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
1a490 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
1a4a0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
1a4b0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
1a4c0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
1a4d0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
1a4e0 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
1a4f0 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
1a500 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
1a510 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
1a520 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
1a530 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
1a540 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
1a550 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
1a560 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
1a570 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
1a580 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
1a590 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1a5a0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
1a5b0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
1a5c0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
1a5d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1a5e0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
1a5f0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
1a600 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
1a610 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
1a620 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
1a630 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
1a640 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
1a650 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
1a660 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
1a670 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
1a680 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
1a690 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
1a6a0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
1a6b0 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
1a6c0 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
1a6d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
1a6e0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
1a6f0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
1a700 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
1a710 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
1a720 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
1a730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a740 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
1a750 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
1a760 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
1a770 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
1a780 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1a790 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
1a7a0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
1a7b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a7c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
1a7d0 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
1a7e0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
1a7f0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
1a800 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
1a810 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
1a820 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
1a830 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
1a840 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
1a850 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
1a860 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
1a870 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
1a880 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
1a890 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
1a8a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
1a8b0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
1a8c0 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
1a8d0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
1a8e0 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
1a8f0 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
1a900 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
1a910 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73   database.  Curs
1a920 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ors that.** have
1a930 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e   been tripped in
1a940 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41  to the CURSOR_FA
1a950 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f  ULT state are no
1a960 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74  t counted..*/.st
1a970 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61  atic int countVa
1a980 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61  lidCursors(BtSha
1a990 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  red *pBt, int wr
1a9a0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
1a9b0 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
1a9c0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
1a9d0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1a9e0 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
1a9f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1aa00 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70  (wrOnly==0 || (p
1aa10 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
1aa20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21  BTCF_WriteFlag)!
1aa30 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72  =0).     && pCur
1aa40 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
1aa50 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
1aa60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
1aa70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1aa80 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
1aa90 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
1aaa0 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
1aab0 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
1aac0 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
1aad0 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
1aae0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
1aaf0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
1ab00 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
1ab10 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
1ab20 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1ab30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
1ab40 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
1ab50 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
1ab60 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
1ab70 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
1ab80 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
1ab90 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
1aba0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1abb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1abc0 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
1abd0 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
1abe0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
1abf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ac00 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1ac10 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1ac20 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1ac30 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c  ors(pBt,0)==0 ||
1ac40 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1ac50 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
1ac60 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
1ac70 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1ac80 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
1ac90 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
1aca0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1acb0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1acc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1acd0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
1ace0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1acf0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
1ad00 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
1ad10 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
1ad20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
1ad30 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
1ad40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
1ad50 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
1ad60 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
1ad70 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
1ad80 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
1ad90 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
1ada0 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
1adb0 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
1adc0 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
1add0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1ade0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
1adf0 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
1ae00 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
1ae10 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
1ae20 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
1ae30 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1ae40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1ae50 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1ae60 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
1ae70 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
1ae80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ae90 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
1aea0 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
1aeb0 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
1aec0 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
1aed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1aee0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
1aef0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1af00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1af10 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
1af20 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
1af30 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
1af40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
1af50 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1af60 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
1af70 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
1af80 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
1af90 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
1afa0 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
1afb0 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
1afc0 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
1afd0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
1afe0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1aff0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
1b000 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
1b010 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
1b020 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
1b030 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
1b040 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
1b050 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
1b060 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
1b070 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
1b080 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
1b090 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
1b0a0 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
1b0b0 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
1b0c0 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
1b0d0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
1b0e0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
1b0f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1b100 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
1b110 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
1b120 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1b130 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
1b140 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
1b150 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
1b160 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
1b170 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
1b180 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
1b190 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
1b1a0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
1b1b0 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
1b1c0 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
1b1d0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
1b1e0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
1b1f0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
1b200 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
1b210 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
1b220 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
1b230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b240 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1b250 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1b260 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b270 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
1b280 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
1b290 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
1b2a0 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
1b2b0 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
1b2c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1b2d0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
1b2e0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
1b2f0 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
1b300 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b310 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
1b320 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1b330 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b340 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
1b350 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
1b360 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1b370 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
1b380 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b3a0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1b3b0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
1b3c0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
1b3d0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
1b3e0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
1b3f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1b400 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
1b410 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
1b420 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
1b430 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
1b440 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
1b450 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
1b460 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
1b470 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
1b480 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
1b490 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1b4a0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
1b4b0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
1b4c0 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
1b4d0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
1b4e0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
1b4f0 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
1b500 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
1b510 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
1b520 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
1b530 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
1b540 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
1b550 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
1b560 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
1b570 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1b580 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
1b590 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
1b5a0 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
1b5b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b5c0 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
1b5d0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1b5e0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
1b5f0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
1b600 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
1b610 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
1b620 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1b630 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
1b640 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b650 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
1b660 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b670 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
1b680 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b690 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
1b6a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b6b0 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
1b6c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b6d0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
1b6e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
1b6f0 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
1b700 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
1b710 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
1b720 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
1b730 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
1b740 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
1b750 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
1b760 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
1b770 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
1b780 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1b790 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
1b7a0 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
1b7b0 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
1b7c0 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
1b7d0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
1b7e0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1b7f0 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
1b800 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
1b810 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1b820 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
1b830 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
1b840 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
1b850 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1b860 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
1b870 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
1b880 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
1b890 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
1b8a0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
1b8b0 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
1b8c0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
1b8d0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
1b8e0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
1b8f0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
1b900 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
1b910 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
1b920 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1b930 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
1b940 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
1b950 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
1b960 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
1b970 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
1b980 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
1b990 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
1b9a0 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
1b9b0 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
1b9c0 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
1b9d0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1b9e0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
1b9f0 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
1ba00 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
1ba10 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
1ba20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
1ba30 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
1ba40 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1ba50 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
1ba60 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
1ba70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1ba80 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
1ba90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
1baa0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1bab0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1bac0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1bad0 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
1bae0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
1baf0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
1bb00 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
1bb10 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
1bb20 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1bb30 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1bb40 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
1bb50 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
1bb60 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1bb70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1bb80 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
1bb90 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
1bba0 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
1bbb0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
1bbc0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
1bbd0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1bbe0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1bbf0 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
1bc00 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
1bc10 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
1bc20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
1bc30 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
1bc40 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
1bc50 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1bc60 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
1bc70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1bc80 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
1bc90 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
1bca0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1bcb0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
1bcc0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
1bcd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bce0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bcf0 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a   {.    sqlite3 *
1bd00 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  pBlock = 0;.    
1bd10 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
1bd20 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
1bd30 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
1bd40 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
1bd50 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  tion .    ** on 
1bd60 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1bd70 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1bd80 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1bd90 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1bda0 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
1bdb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
1bdc0 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  CKED..    */.   
1bdd0 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
1bde0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bdf0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
1be00 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  .     || (pBt->b
1be10 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
1be20 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b  NDING)!=0.    ){
1be30 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  .      pBlock = 
1be40 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1be50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1be60 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
1be70 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1be80 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72  .      for(pIter
1be90 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
1bea0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
1beb0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
1bec0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
1bed0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
1bee0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
1bef0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
1bf00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1bf10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bf20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1bf30 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  pBlock ){.      
1bf40 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
1bf50 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
1bf60 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  pBlock);.      r
1bf70 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
1bf80 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1bf90 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
1bfa0 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begun;.    }.  }
1bfb0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1bfc0 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1bfd0 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1bfe0 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1bff0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1c000 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1c010 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1c020 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1c030 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1c040 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1c050 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1c060 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1c070 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1c080 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1c090 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1c0a0 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1c0b0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1c0c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1c0d0 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1c0e0 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1c0f0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1c100 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1c110 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1c120 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1c130 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1c140 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1c150 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1c160 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1c170 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1c180 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1c190 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1c1a0 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1c1b0 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1c1c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1c1d0 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1c1e0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1c1f0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1c200 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1c210 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1c220 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1c230 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1c240 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1c250 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1c260 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1c270 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1c280 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1c290 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1c2a0 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1c2b0 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1c2c0 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1c2d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1c2e0 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1c2f0 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1c300 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1c310 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1c320 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1c330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c340 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1c350 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1c360 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1c370 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1c380 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1c390 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1c3a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c3b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c3c0 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
1c3d0 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
1c3e0 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
1c3f0 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
1c400 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c420 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1c430 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1c440 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c450 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
1c460 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c470 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
1c480 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1c490 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1c4a0 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
1c4b0 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
1c4c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1c4d0 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
1c4e0 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
1c4f0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
1c500 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
1c510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c520 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1c530 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1c540 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1c550 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
1c560 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1c570 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1c580 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
1c590 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1c5a0 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
1c5b0 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
1c5c0 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
1c5d0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
1c5e0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
1c5f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1c600 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
1c610 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
1c620 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
1c630 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
1c640 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
1c650 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
1c660 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
1c670 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
1c680 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
1c690 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c6a0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
1c6b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
1c6c0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
1c6d0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1c6e0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
1c6f0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1c700 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
1c710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1c720 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
1c730 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
1c740 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
1c750 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
1c760 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1c770 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
1c780 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
1c790 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
1c7a0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1c7b0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
1c7c0 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
1c7d0 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
1c7e0 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
1c7f0 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
1c800 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
1c810 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
1c820 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
1c830 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c840 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
1c850 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
1c860 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
1c870 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
1c880 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1c890 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
1c8a0 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
1c8b0 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1c8c0 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
1c8d0 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
1c8e0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
1c8f0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
1c900 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
1c910 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1c920 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c930 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
1c940 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1c950 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
1c960 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c970 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1c980 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1c990 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c9b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1c9c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1c9d0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1c9e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c9f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
1ca00 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1ca10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca20 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1ca30 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1ca40 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1ca50 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1ca60 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1ca70 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1ca80 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1ca90 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1caa0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1cab0 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1cac0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1cad0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1cae0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1caf0 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1cb00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1cb10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1cb20 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1cb30 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
1cb40 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
1cb50 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1cb60 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
1cb70 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1cb80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1cb90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cba0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
1cbb0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
1cbc0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
1cbd0 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
1cbe0 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
1cbf0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
1cc00 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
1cc10 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
1cc20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1cc30 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
1cc40 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
1cc50 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
1cc60 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
1cc70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
1cc80 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
1cc90 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1cca0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
1ccd0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
1cce0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cd00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
1cd10 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
1cd20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1cd50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
1cd60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1cd70 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
1cd80 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
1cd90 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
1cda0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1cdb0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1cdc0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 70 50  ex) );.  rc = pP
1cdd0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51  age->isInit ? SQ
1cde0 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49  LITE_OK : btreeI
1cdf0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1ce00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ce10 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1ce20 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1ce30 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1ce40 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1ce50 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1ce60 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1ce70 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1ce80 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1ce90 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1cea0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1ceb0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1cec0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1ced0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1cee0 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1cef0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1cf00 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1cf10 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1cf20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1cf30 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1cf40 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1cf50 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1cf60 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1cf70 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1cf80 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1cf90 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1cfa0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1cfb0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72  , &rc);.  }..  r
1cfc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cfd0 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
1cfe0 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
1cff0 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
1d000 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
1d010 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
1d020 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
1d030 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
1d040 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
1d050 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
1d060 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
1d070 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
1d080 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
1d090 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
1d0a0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1d0b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1d0c0 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
1d0d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d0e0 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
1d0f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1d100 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
1d110 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1d120 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1d130 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
1d140 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
1d150 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
1d160 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
1d170 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
1d180 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1d190 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
1d1a0 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
1d1b0 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
1d1c0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1d1d0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1d1f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1d200 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
1d210 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
1d220 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
1d230 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
1d240 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
1d250 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
1d260 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d270 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1d280 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1d290 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1d2a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1d2b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
1d2c0 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
1d2d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d2e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
1d2f0 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
1d300 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1d310 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
1d320 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
1d330 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
1d340 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
1d350 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1d360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d370 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1d380 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  );.    }.    put
1d390 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1d3a0 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1d3b0 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
1d3c0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1d3d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1d3e0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1d3f0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1d400 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1d410 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1d420 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1d430 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1d440 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1d450 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1d460 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1d470 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1d480 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1d490 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1d4a0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1d4b0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1d4c0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1d4d0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1d4e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1d4f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1d500 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
1d510 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
1d520 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1d530 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20  ll+info.nSize > 
1d540 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1d550 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
1d560 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1d570 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d580 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1d590 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d5a0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1d5b0 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
1d5c0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1d5d0 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
1d5e0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1d5f0 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1d600 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1d610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d630 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d640 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1d650 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
1d660 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1d670 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
1d680 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1d690 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1d6a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1d6b0 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
1d6c0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
1d6d0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
1d6e0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
1d6f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1d700 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1d710 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
1d720 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1d730 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1d740 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
1d750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
1d760 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d770 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d780 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
1d790 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d7a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d7b0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1d7c0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1d7d0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1d7e0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1d7f0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1d800 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1d810 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1d820 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1d830 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1d840 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1d850 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1d860 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1d870 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1d880 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1d890 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1d8a0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1d8b0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1d8c0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1d8d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1d8e0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1d8f0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1d900 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1d910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1d920 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1d930 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1d940 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1d950 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1d960 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1d970 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1d980 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1d990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d9a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1d9b0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1d9c0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1d9d0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1d9e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1d9f0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1da00 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1da10 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1da20 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1da30 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1da40 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1da50 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1da60 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1da70 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1da80 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1da90 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1daa0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1dab0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1dac0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1dad0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1dae0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1daf0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1db00 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1db10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1db20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1db30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1db40 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1db50 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1db60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1db70 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1db80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1db90 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1dba0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1dbb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1dbc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1dbd0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1dbe0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1dbf0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1dc00 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1dc10 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1dc20 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1dc30 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1dc40 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1dc50 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1dc60 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1dc70 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1dc80 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1dc90 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1dca0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1dcb0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1dcc0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1dcd0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1dce0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1dcf0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1dd00 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1dd10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dd20 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1dd30 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1dd40 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1dd50 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1dd60 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1dd70 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1dd80 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1dd90 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1dda0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1ddb0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1ddc0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1ddd0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1dde0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1ddf0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1de00 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1de10 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1de20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1de30 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1de40 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1de50 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1de60 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1de70 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1de80 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1de90 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1dea0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1deb0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1dec0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1ded0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1dee0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1def0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1df00 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1df10 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1df20 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1df30 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1df40 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1df50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1df60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1df70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1df80 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1df90 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1dfa0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1dfb0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1dfc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1dfd0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1dfe0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1dff0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1e000 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1e010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e020 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e030 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1e040 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1e050 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1e060 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1e070 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1e080 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1e090 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1e0a0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1e0b0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1e0c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1e0d0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1e0e0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1e0f0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1e100 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1e110 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1e120 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1e130 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1e140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e160 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e170 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e180 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1e190 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1e1a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e1b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1e1c0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1e1d0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1e1e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1e1f0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1e200 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1e210 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1e220 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1e230 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1e240 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1e250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e260 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1e270 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1e280 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1e290 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1e2a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e2b0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1e2c0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1e2d0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1e2e0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1e2f0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1e300 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1e310 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1e320 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1e330 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1e340 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1e350 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1e360 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1e370 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1e380 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1e390 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1e3a0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1e3b0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1e3c0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1e3d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1e3e0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1e3f0 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1e400 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1e410 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1e420 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1e430 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1e440 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1e450 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1e460 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1e470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1e480 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1e490 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1e4a0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1e4b0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1e4c0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1e4d0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1e4e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1e4f0 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1e500 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1e510 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1e520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1e530 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1e540 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1e550 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1e560 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1e570 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1e580 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1e590 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1e5a0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1e5b0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1e5c0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1e5d0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1e5e0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1e5f0 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1e600 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1e610 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1e620 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1e630 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1e640 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1e650 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1e660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1e670 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1e680 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1e690 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1e6a0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1e6b0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1e6c0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1e6d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e6e0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1e6f0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1e700 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1e710 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e720 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1e740 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1e750 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1e760 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1e770 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1e780 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e790 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1e7a0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1e7b0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1e7c0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1e7d0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e7e0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1e7f0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1e800 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e810 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1e820 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1e830 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1e840 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1e850 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1e860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e870 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e880 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1e890 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e8a0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1e8b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e8d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1e8e0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1e8f0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1e900 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1e910 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1e920 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1e930 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1e940 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1e950 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1e960 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1e970 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1e980 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1e990 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1e9a0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1e9b0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1e9c0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1e9d0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1e9e0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1e9f0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1ea00 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1ea10 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1ea20 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1ea30 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1ea40 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1ea50 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1ea60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1ea70 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1ea80 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1ea90 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1eaa0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1eab0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1eac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ead0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1eae0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1eaf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1eb00 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1eb10 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1eb20 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1eb30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1eb40 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1eb50 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1eb60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1eb70 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1eb80 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1eb90 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1eba0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1ebb0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1ebc0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1ebd0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1ebe0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1ebf0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1ec00 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1ec10 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1ec20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1ec30 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1ec40 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1ec50 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1ec60 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1ec70 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1ec80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ec90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1eca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1ecb0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1ecc0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1ecd0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1ece0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1ecf0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1ed00 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1ed10 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1ed20 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1ed30 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1ed40 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1ed50 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1ed60 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1ed70 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1ed80 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1ed90 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1eda0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1edb0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1edc0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1edd0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1ede0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1edf0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1ee00 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1ee10 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1ee20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1ee30 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1ee40 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1ee50 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1ee60 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1ee70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1ee80 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1ee90 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1eea0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1eeb0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1eec0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1eed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eee0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1eef0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1ef00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ef10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ef20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ef30 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1ef40 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1ef50 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1ef60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ef70 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1ef80 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1ef90 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1efa0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1efb0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1efc0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1efd0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1efe0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1eff0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f020 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f030 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1f040 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1f050 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1f060 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1f070 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1f080 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1f090 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1f0a0 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1f0b0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1f0c0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1f0d0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1f0e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f0f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f100 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1f110 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1f120 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1f130 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1f140 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1f150 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1f160 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1f170 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1f180 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1f190 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1f1a0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1f1b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1f1c0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1f1d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1f1e0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1f1f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1f200 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1f210 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1f220 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1f230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f240 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1f250 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1f260 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1f270 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1f280 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f290 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1f2a0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1f2b0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1f2e0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1f2f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1f300 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1f310 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1f320 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1f330 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1f340 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1f350 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1f360 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1f370 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1f380 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1f390 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1f3a0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1f3b0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1f3c0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1f3d0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1f3e0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1f3f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f400 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1f410 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1f420 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1f430 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1f440 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1f450 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1f460 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1f470 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1f480 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1f490 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1f4a0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1f4b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1f4c0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1f4d0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1f4e0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1f4f0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1f500 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1f510 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1f520 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1f530 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1f540 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1f550 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1f560 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1f570 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1f580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f590 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1f5a0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1f5b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1f5c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1f5d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f5e0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1f5f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1f600 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1f610 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1f620 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1f630 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1f640 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1f650 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1f660 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1f670 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1f680 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1f690 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1f6a0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1f6b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1f6c0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1f6d0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1f6e0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1f6f0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1f700 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1f710 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1f720 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1f730 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1f740 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1f750 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1f760 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1f770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f780 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1f790 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1f7a0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1f7b0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1f7c0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1f7d0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1f7e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1f7f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f800 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f810 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1f820 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1f830 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1f840 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1f850 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1f860 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1f870 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1f880 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f890 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1f8a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1f8b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1f8c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f8d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1f8e0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1f8f0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f900 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1f910 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1f920 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1f930 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1f940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1f950 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1f960 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1f970 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1f980 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1f990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f9a0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1f9b0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1f9c0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1f9d0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1f9e0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1f9f0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1fa00 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1fa10 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1fa20 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1fa30 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1fa40 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1fa50 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1fa60 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1fa70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1fa80 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1fa90 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1faa0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1fab0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1fac0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1fad0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1fae0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1faf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1fb00 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1fb10 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1fb20 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1fb30 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1fb40 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1fb50 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1fb60 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1fb70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1fb80 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1fb90 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1fba0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1fbb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1fbc0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1fbd0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1fbe0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1fbf0 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1fc00 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1fc10 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1fc20 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1fc30 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1fc40 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1fc50 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1fc60 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1fc70 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1fc80 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1fc90 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1fca0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1fcb0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1fcc0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1fcd0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1fce0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1fcf0 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1fd00 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1fd10 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1fd20 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1fd30 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1fd40 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1fd50 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1fd60 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1fd70 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1fd80 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1fd90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fda0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fdb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1fdc0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1fdd0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fde0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1fdf0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1fe00 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1fe10 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1fe20 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1fe30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1fe40 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1fe50 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1fe60 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1fe70 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1fe80 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1fe90 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1fea0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1feb0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1fec0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1fed0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1fee0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1fef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ff00 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1ff10 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1ff20 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1ff30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ff40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1ff50 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1ff60 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1ff70 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ff80 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1ff90 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ffa0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1ffb0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1ffc0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1ffd0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ffe0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1fff0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
20000 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
20010 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
20020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20030 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20040 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20050 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
20060 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
20070 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
20080 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
20090 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
200a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
200b0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
200c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
200d0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
200e0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
200f0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
20100 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
20110 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
20120 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
20130 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
20140 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
20150 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
20160 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20170 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
20180 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
20190 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
201a0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
201b0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
201c0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
201d0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
201e0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
201f0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
20200 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
20210 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
20220 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
20230 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
20240 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
20250 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
20260 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
20270 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
20280 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
20290 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
202a0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
202b0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
202c0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
202d0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
202e0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
202f0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
20300 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
20310 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
20320 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
20330 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
20340 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
20350 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
20360 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
20370 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20380 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
20390 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
203a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
203b0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
203c0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
203d0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
203e0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
203f0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
20400 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
20410 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
20420 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
20430 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
20440 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
20450 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
20460 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
20470 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
20480 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
20490 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
204a0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
204b0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
204c0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
204d0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
204e0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
204f0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
20500 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20510 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
20520 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
20530 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
20540 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
20550 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
20560 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
20570 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
20580 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
20590 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
205a0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
205b0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
205c0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
205d0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
205e0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
205f0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
20600 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
20610 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
20620 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
20630 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
20640 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
20650 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
20660 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20670 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
20680 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
20690 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
206a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
206b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
206c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
206d0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
206e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
206f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20700 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
20710 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20720 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
20730 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
20740 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
20750 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
20760 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20780 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20790 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
207a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
207b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
207c0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
207d0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
207e0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
207f0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
20800 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
20810 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
20820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20830 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
20840 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
20850 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
20860 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20870 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
20880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20890 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
208a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
208b0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
208c0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
208d0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
208e0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
208f0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
20900 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
20910 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
20920 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
20930 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20940 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
20950 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
20960 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20970 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
20980 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
20990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
209a0 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
209b0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
209c0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
209d0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
209e0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
209f0 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
20a00 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
20a10 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
20a20 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
20a30 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
20a40 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
20a50 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
20a60 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
20a70 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
20a80 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
20a90 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
20aa0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
20ab0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
20ac0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
20ad0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20ae0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
20af0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
20b00 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
20b10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
20b20 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
20b30 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
20b40 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
20b50 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
20b60 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
20b70 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
20b80 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
20b90 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
20ba0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
20bb0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
20bc0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
20bd0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
20be0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
20bf0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
20c00 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
20c10 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
20c20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
20c30 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
20c40 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
20c50 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
20c60 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
20c70 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
20c80 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
20c90 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
20ca0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
20cb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
20cc0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
20cd0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20ce0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
20cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
20d00 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
20d10 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
20d20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
20d30 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
20d40 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
20d50 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
20d60 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
20d70 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
20d80 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
20d90 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
20da0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
20db0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
20dc0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
20dd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20de0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
20df0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
20e00 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
20e10 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
20e20 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
20e30 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
20e40 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
20e50 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
20e60 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
20e70 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
20e80 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
20e90 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
20ea0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
20eb0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
20ec0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20ed0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
20ee0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
20ef0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
20f00 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
20f10 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
20f20 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
20f30 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
20f40 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
20f50 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
20f60 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
20f70 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
20f80 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
20f90 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
20fa0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
20fb0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
20fc0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
20fd0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
20fe0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
20ff0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
21000 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
21010 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
21020 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
21030 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
21040 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
21050 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
21060 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
21070 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
21080 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
21090 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
210a0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
210b0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
210c0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
210d0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
210e0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
210f0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
21100 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
21110 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
21120 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
21130 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
21140 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
21150 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
21160 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
21170 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
21180 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
21190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
211a0 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
211b0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
211c0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
211d0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
211e0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
211f0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
21200 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
21210 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
21220 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
21230 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
21240 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
21250 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
21260 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
21270 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
21280 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
21290 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
212a0 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
212b0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
212c0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
212d0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
212e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
212f0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
21300 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
21310 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
21320 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
21330 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
21340 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21350 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
21360 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
21370 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
21380 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21390 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
213a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
213b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
213c0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
213d0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
213e0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
213f0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
21400 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
21410 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
21420 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
21430 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
21440 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
21450 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
21460 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
21470 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
21480 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
21490 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
214a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
214b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
214c0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
214d0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
214e0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
214f0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
21500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21510 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
21520 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
21530 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21540 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
21550 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
21560 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
21570 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
21580 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
21590 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
215a0 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
215b0 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
215c0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
215d0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
215e0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
215f0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
21600 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
21610 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
21620 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
21630 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
21640 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
21650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21660 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
21670 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
21680 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
21690 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
216a0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
216b0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
216c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
216d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
216e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
216f0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
21700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
21710 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21720 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
21730 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
21740 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21750 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
21760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
21770 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
21780 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
21790 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
217a0 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
217b0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
217c0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
217d0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
217e0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
217f0 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
21800 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
21810 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
21820 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
21830 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
21840 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
21850 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
21860 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
21870 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
21880 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
21890 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
218a0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
218b0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
218c0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
218d0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
218e0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
218f0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
21900 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21910 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
21920 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
21930 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
21940 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
21950 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
21960 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
21970 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
21980 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
21990 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
219a0 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
219b0 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
219c0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
219d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
219e0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
219f0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
21a00 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
21a10 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
21a20 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
21a30 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
21a40 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
21a50 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
21a60 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
21a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
21a80 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
21a90 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
21aa0 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
21ab0 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
21ac0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21ad0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
21ae0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
21af0 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
21b00 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
21b10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
21b20 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
21b30 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
21b40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
21b50 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
21b60 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
21b70 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
21b80 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
21b90 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
21ba0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
21bb0 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
21bc0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
21bd0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21be0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
21bf0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
21c00 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
21c10 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
21c20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
21c30 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
21c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21c50 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
21c60 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
21c70 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
21c80 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
21c90 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
21ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21cb0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
21cc0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
21cd0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
21ce0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
21cf0 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
21d00 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
21d10 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
21d20 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
21d30 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
21d40 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
21d50 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72  t){.      if( wr
21d60 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63  iteOnly && (p->c
21d70 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
21d80 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a  riteFlag)==0 ){.
21d90 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
21da0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21db0 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
21dc0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
21dd0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
21de0 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
21df0 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
21e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21e20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
21e30 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
21e40 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72  ursors(pBtree, r
21e50 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
21e60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21e80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21e90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
21ea0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
21eb0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
21ec0 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
21ed0 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b  T;.        p->sk
21ee0 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
21ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21f00 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
21f10 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
21f20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21f30 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
21f40 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
21f50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
21f60 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
21f70 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
21f80 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
21f90 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
21fa0 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
21fb0 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
21fc0 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
21fd0 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
21fe0 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
21ff0 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
22000 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
22010 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
22020 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
22030 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
22040 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
22050 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
22060 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
22070 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
22080 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
22090 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
220a0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
220b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
220c0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
220d0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
220e0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
220f0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
22100 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22110 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
22120 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
22130 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
22140 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
22150 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22160 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
22170 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
22180 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
22190 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
221a0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
221b0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
221c0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
221d0 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
221e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
221f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22200 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
22210 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
22220 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
22230 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
22240 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
22250 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
22260 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
22270 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
22280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
22290 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
222a0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
222b0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
222c0 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
222d0 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
222e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
222f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
22300 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
22310 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
22320 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
22330 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
22340 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
22350 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
22360 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
22370 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
22380 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
22390 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
223a0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
223b0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
223c0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
223d0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
223e0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
223f0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
22400 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
22410 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
22420 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
22430 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
22440 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
22450 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
22460 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
22470 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
22480 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
22490 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
224a0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
224b0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
224c0 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
224d0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
224e0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
224f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
22500 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
22510 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
22520 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
22530 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
22540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
22550 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
22560 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
22570 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
22580 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
22590 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
225a0 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
225b0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
225c0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
225d0 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
225e0 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
225f0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
22600 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
22610 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
22620 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
22630 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
22640 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
22650 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
22660 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
22670 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
22680 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22690 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
226a0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
226b0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
226c0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
226d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
226e0 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
226f0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
22700 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
22710 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
22720 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
22730 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
22740 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
22750 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
22760 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
22770 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
22780 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
22790 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
227a0 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
227b0 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
227c0 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
227d0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
227e0 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
227f0 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
22800 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
22810 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
22820 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
22830 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
22840 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
22850 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
22860 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22870 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
22880 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
22890 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
228a0 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
228b0 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
228c0 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
228d0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
228e0 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
228f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
22900 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
22910 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
22920 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
22930 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
22940 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
22950 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
22960 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
22970 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
22980 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
22990 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
229a0 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
229b0 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
229c0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
229d0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
229e0 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
229f0 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
22a00 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
22a10 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
22a20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
22a30 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
22a40 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
22a50 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
22a60 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
22a70 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
22a80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22a90 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
22aa0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
22ab0 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
22ac0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
22ad0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
22ae0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
22af0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
22b00 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
22b10 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
22b20 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
22b30 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
22b40 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
22b50 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
22b60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
22b70 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
22b80 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
22b90 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
22ba0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
22bb0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
22bc0 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
22bd0 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
22be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
22bf0 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
22c00 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
22c10 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
22c20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
22c30 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
22c40 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
22c50 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
22c60 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
22c70 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
22c80 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
22c90 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
22ca0 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
22cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
22cc0 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
22cd0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
22ce0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
22cf0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
22d00 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
22d10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22d20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22d30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22d40 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
22d50 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
22d60 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
22d70 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
22d80 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
22d90 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
22da0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
22db0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
22dc0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
22dd0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
22de0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
22df0 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
22e00 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
22e10 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
22e20 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
22e30 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
22e40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
22e50 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
22e60 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
22e70 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
22e80 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
22e90 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
22ea0 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
22eb0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
22ec0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
22ed0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
22ee0 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
22ef0 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
22f00 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
22f10 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
22f20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
22f30 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
22f40 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
22f50 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
22f60 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
22f70 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
22f80 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
22f90 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
22fa0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
22fb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22fc0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
22fd0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
22fe0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
22ff0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
23000 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
23010 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
23020 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
23030 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
23040 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
23050 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
23060 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
23070 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
23080 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
23090 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
230a0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  (p);.    if( op=
230b0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
230c0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
230d0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
230e0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
230f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23120 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
23130 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
23140 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
23150 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23170 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
23180 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
23190 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
231a0 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
231b0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
231c0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
231d0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
231e0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
231f0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
23200 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
23210 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
23220 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
23230 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
23240 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
23250 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
23260 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
23270 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
23280 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
23290 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
232a0 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
232b0 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
232c0 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
232d0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
232e0 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
232f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23300 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
23310 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
23330 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
23340 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
23350 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
23360 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
23370 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
23380 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
23390 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
233a0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
233b0 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
233c0 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
233d0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
233e0 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
233f0 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
23400 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
23410 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
23420 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
23430 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
23440 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
23450 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
23460 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
23470 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
23480 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63  t of wrFlag is c
23490 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63  lear, then the c
234a0 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a  ursor can only.*
234b0 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  * be used for re
234c0 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42  ading.  If the B
234d0 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 69  TREE_WRCSR bit i
234e0 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
234f0 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65  cursor.** can be
23500 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
23510 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67  g or for writing
23520 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
23530 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
23540 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  .** are also met
23550 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68 65  .  These are the
23560 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
23570 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
23580 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69  order.** for wri
23590 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77  ting to be allow
235a0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
235b0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
235c0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
235d0 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61  ith wrFlag conta
235e0 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53  ining BTREE_WRCS
235f0 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  R.**.** 2:  Othe
23600 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
23610 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
23620 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
23630 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
23640 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
23650 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
23660 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
23670 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
23680 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
23690 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
236a0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
236b0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
236c0 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
236d0 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
236e0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
236f0 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
23700 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
23710 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
23720 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
23730 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
23740 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
23750 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
23760 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
23770 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
23780 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
23790 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
237a0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
237b0 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45   BTREE_FORDELETE
237c0 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d   bit of wrFlag m
237d0 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65  ay optionally be
237e0 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57 52   set if BTREE_WR
237f0 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20  CSR.** is set.  
23800 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20  If FORDELETE is 
23810 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68  set, that is a h
23820 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
23830 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a  mentation that.*
23840 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 69  * this cursor wi
23850 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ll only be used 
23860 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64  to seek to and d
23870 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66  elete entries of
23880 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20   an index.** as 
23890 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72  part of a larger
238a0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
238b0 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54  t.  The FORDELET
238c0 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73  E hint is not us
238d0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d  ed by.** this im
238e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42  plementation.  B
238f0 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74  ut in a hypothet
23900 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65  ical alternative
23910 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20   storage engine 
23920 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64  .** in which ind
23930 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ex entries are a
23940 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
23950 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73  eted when corres
23960 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a  ponding table.**
23970 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65   rows are delete
23980 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45  d, the FORDELETE
23990 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20   flag is a hint 
239a0 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e  that all SEEK an
239b0 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72  d DELETE.** oper
239c0 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63  ations on this c
239d0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d  ursor can be no-
239e0 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44  ops and all READ
239f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20   operations can 
23a00 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c  .** return a nul
23a10 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20  l row (2-bytes: 
23a20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a  0x01 0x00)..**.*
23a30 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
23a40 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
23a50 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
23a60 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
23a70 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
23a80 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
23a90 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
23aa0 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
23ab0 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
23ac0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
23ad0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
23ae0 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
23af0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
23b00 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
23b10 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
23b20 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
23b30 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
23b40 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
23b50 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
23b60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
23b70 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
23b80 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
23bb0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
23bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23be0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
23bf0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
23c00 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
23c30 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
23c40 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
23c50 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23c70 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
23c80 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
23c90 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
23ca0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23cc0 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
23cd0 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
23ce0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23cf0 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
23d00 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
23d10 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
23d20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20    BtCursor *pX; 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
23d50 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61  ing over other a
23d60 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20  ll cursors */.. 
23d70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23d80 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
23d90 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
23da0 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20  wrFlag==0 .     
23db0 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52    || wrFlag==BTR
23dc0 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20  EE_WRCSR .      
23dd0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52   || wrFlag==(BTR
23de0 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46  EE_WRCSR|BTREE_F
23df0 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a  ORDELETE) .  );.
23e00 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
23e10 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
23e20 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
23e30 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
23e40 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
23e50 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
23e60 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
23e70 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
23e80 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
23e90 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
23ea0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
23eb0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
23ec0 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
23ed0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
23ee0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
23ef0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
23f00 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
23f10 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
23f20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72  pKeyInfo!=0, (wr
23f30 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20  Flag?2:1)) );.  
23f40 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
23f50 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
23f60 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
23f70 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
23f80 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
23f90 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
23fa0 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
23fb0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
23fc0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
23fd0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
23fe0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
23ff0 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
24000 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
24010 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
24020 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
24030 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
24040 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24050 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 || (pBt->btsFl
24060 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
24070 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  NLY)==0 );..  if
24080 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrFlag ){.    
24090 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
240a0 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  e(pBt);.    if( 
240b0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d  pBt->pTmpSpace==
240c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
240d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
240e0 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
240f0 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
24100 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
24110 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
24120 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
24130 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
24140 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
24150 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
24160 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
24170 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
24180 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
24190 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
241a0 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
241b0 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
241c0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
241d0 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
241e0 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
241f0 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
24200 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
24210 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
24220 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
24230 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
24240 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
24250 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72  wrFlag ? BTCF_Wr
24260 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70  iteFlag : 0;.  p
24270 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
24280 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20  gs = wrFlag ? 0 
24290 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  : PAGER_GET_READ
242a0 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68  ONLY;.  /* If th
242b0 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
242c0 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
242d0 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
242e0 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a  hen all such.  *
242f0 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a  * cursors *must*
24300 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d   have the BTCF_M
24310 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
24320 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42  . */.  for(pX=pB
24330 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20  t->pCursor; pX; 
24340 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
24350 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52     if( pX->pgnoR
24360 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c  oot==(Pgno)iTabl
24370 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63  e ){.      pX->c
24380 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
24390 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20  Multiple;.      
243a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
243b0 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
243c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
243d0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
243e0 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e  pCursor;.  pBt->
243f0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
24400 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24410 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
24420 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24430 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
24440 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
24450 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24480 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
24490 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
244c0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
244d0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
244e0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
24510 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
24520 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
24530 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
24540 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
24550 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
24560 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
24570 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
24580 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
245b0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
245c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
245d0 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20   iTable<1 ){.   
245e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
245f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
24600 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  se{.    sqlite3B
24610 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
24620 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
24630 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
24640 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
24650 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  pCur);.    sqlit
24660 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
24670 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24690 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
246a0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
246b0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
246c0 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
246d0 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
246e0 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
246f0 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
24700 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
24710 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
24720 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
24730 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
24740 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
24750 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
24760 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
24770 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
24780 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
24790 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
247a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
247b0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
247c0 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
247d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
247e0 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
247f0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
24800 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
24810 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
24820 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
24830 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
24840 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
24850 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
24860 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
24870 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
24880 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
24890 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
248a0 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
248b0 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
248c0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
248d0 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
248e0 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
248f0 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
24900 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
24910 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
24920 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
24930 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
24940 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
24950 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
24960 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
24970 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
24980 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
24990 2c 20 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54  , BTCURSOR_FIRST
249a0 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a  _UNINIT));.}../*
249b0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
249c0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
249d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
249e0 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
249f0 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
24a00 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
24a10 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
24a20 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
24a30 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
24a40 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
24a50 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
24a60 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
24a70 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ree ){.    BtSha
24a80 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
24a90 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
24aa0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
24ab0 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
24ac0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30   pBt->pCursor!=0
24ad0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   );.    if( pBt-
24ae0 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29  >pCursor==pCur )
24af0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
24b00 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
24b10 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
24b20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70       BtCursor *p
24b30 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72  Prev = pBt->pCur
24b40 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  sor;.      do{. 
24b50 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
24b60 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b  ->pNext==pCur ){
24b70 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76  .          pPrev
24b80 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
24b90 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
24ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24bb0 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  }.        pPrev 
24bc0 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a  = pPrev->pNext;.
24bd0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c        }while( AL
24be0 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20  WAYS(pPrev) );. 
24bf0 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65     }.    btreeRe
24c00 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
24c10 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75  ges(pCur);.    u
24c20 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
24c30 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
24c40 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
24c50 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
24c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
24c70 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71  r->pKey);.    sq
24c80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
24c90 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
24ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
24cc0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
24cd0 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
24ce0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
24cf0 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
24d00 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
24d10 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
24d20 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
24d30 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
24d40 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
24d50 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
24d60 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
24d70 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
24d80 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
24d90 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
24da0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
24db0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
24dc0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
24dd0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
24de0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
24df0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
24e00 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
24e10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24e20 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
24e30 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
24e40 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
24e50 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
24e60 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
24e70 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  >pPage, pCur->ix
24e80 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
24e90 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
24ea0 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f   || memcmp(&info
24eb0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
24ec0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
24ed0 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
24ee0 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
24ef0 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
24f00 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
24f10 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43  INLINE void getC
24f20 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
24f30 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
24f40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
24f50 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
24f60 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
24f70 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
24f80 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
24f90 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d  Cur->pPage,pCur-
24fa0 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  >ix,&pCur->info)
24fb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
24fc0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
24fd0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
24fe0 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
24ff0 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
25000 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
25010 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
25020 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
25030 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
25040 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
25050 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
25060 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
25070 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
25080 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
25090 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
250a0 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
250b0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
250c0 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
250d0 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
250e0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
250f0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
25100 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
25110 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
25120 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
25130 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
25140 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25150 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
25160 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
25170 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25180 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28  CursorIsValidNN(
25190 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
251a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
251b0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
251c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
251d0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
251e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
251f0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
25200 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69  ger key or "rowi
25210 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  d" for a table b
25220 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tree..** This ro
25230 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61  utine is only va
25240 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  lid for a cursor
25250 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e   that is pointin
25260 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69  g into a.** ordi
25270 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65  nary table btree
25280 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
25290 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e   points to an in
252a0 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20  dex btree or.** 
252b0 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20  is invalid, the 
252c0 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72  result of this r
252d0 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69  outine is undefi
252e0 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ned..*/.i64 sqli
252f0 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
25300 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
25310 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
25320 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25330 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25340 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25350 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
25360 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25370 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67  curIntKey );.  g
25380 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
25390 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
253a0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23  >info.nKey;.}..#
253b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
253c0 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
253d0 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UNC./*.** Return
253e0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
253f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25400 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  le for the start
25410 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f   of the.** paylo
25420 61 64 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ad to which the 
25430 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25440 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  ng..*/.i64 sqlit
25450 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 42 74  e3BtreeOffset(Bt
25460 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25470 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25480 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
254a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
254b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
254c0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
254d0 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 70 43    return (i64)pC
254e0 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ur->pBt->pageSiz
254f0 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70 50  e*((i64)pCur->pP
25500 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b  age->pgno - 1) +
25510 0a 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28  .         (i64)(
25520 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
25530 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61 67  oad - pCur->pPag
25540 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e  e->aData);.}.#en
25550 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
25560 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
25570 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  FUNC */../*.** R
25580 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
25590 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79   of bytes of pay
255a0 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74  load for the ent
255b0 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  ry that pCur is.
255c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
255d0 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74  nting to.  For t
255e0 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69  able btrees, thi
255f0 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d  s will be the am
25600 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ount.** of data.
25610 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65    For index btre
25620 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  es, this will be
25630 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
25640 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
25650 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
25660 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
25670 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
25680 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
25690 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
256a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
256b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
256c0 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
256d0 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
256e0 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
256f0 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
25700 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32  OR_VALID..*/.u32
25710 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
25720 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f  loadSize(BtCurso
25730 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
25740 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25750 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25760 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25770 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25780 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
25790 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
257a0 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
257b0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  Payload;.}../*.*
257c0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
257d0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
257e0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
257f0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
25800 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
25810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
25820 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
25830 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
25840 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
25850 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
25860 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
25870 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
25880 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
25890 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
258a0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
258b0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
258c0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
258d0 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
258e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
258f0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
25900 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
25910 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
25920 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
25930 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25940 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
25950 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
25960 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
25970 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
25980 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
25990 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
259a0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
259b0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
259c0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
259d0 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
259e0 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
259f0 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
25a00 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
25a10 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
25a20 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
25a30 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
25a40 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
25a50 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
25a60 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
25a70 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
25a80 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
25a90 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
25aa0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
25ab0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
25ac0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
25ad0 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
25ae0 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
25af0 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
25b00 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
25b10 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
25b20 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
25b30 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
25b40 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
25b50 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
25b60 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
25b70 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
25b80 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
25b90 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
25ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25bb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25bc0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
25bf0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
25c00 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
25c10 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
25c20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
25c30 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
25c40 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
25c50 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
25c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25c70 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
25c80 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
25c90 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
25ca0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
25cb0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
25cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
25cd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25ce0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
25cf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25d00 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
25d10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25d20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25d30 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
25d40 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
25d50 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
25d60 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
25d70 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
25d80 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
25d90 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
25da0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
25db0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
25dc0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
25dd0 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
25de0 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
25df0 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
25e00 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
25e10 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
25e20 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
25e30 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
25e40 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
25e50 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
25e60 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
25e70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
25e80 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
25e90 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
25ea0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
25eb0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
25ec0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
25ed0 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
25ee0 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
25ef0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
25f00 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
25f10 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
25f20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
25f30 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
25f40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
25f50 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
25f60 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
25f70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
25f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25f90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
25fa0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
25fb0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
25fc0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
25fd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25fe0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
25ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
26000 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
26010 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
26020 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
26030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26040 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
26050 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
26060 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
26070 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
26080 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
26090 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
260a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
260b0 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
260c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
260d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
260e0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
260f0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
26100 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
26110 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
26120 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
26130 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
26140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
26150 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
26160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
26170 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
26180 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
26190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
261a0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
261b0 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
261c0 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
261d0 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
261e0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
261f0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
26200 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
26210 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
26220 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
26230 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
26240 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
26250 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
26260 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
26270 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
26280 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
26290 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
262a0 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
262b0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
262c0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
262d0 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
262e0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
262f0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
26300 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
26310 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
26320 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
26330 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
26340 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
26350 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
26360 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
26370 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
26380 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
26390 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
263a0 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
263b0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
263c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
263d0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
263e0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26400 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
26410 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
26420 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
26430 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
26440 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
26450 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
26460 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
26470 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
26480 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
26490 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
264a0 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
264b0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
264c0 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
264d0 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
264e0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
264f0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
26500 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
26510 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
26520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26530 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26540 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
26550 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
26560 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
26570 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
26580 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
26590 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
265a0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
265b0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
265c0 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
265d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
265e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
265f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26600 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
26610 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
26620 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
26630 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
26640 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
26650 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
26660 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
26670 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
26680 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
26690 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
266a0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
266b0 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
266c0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
266d0 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
266e0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
266f0 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
26700 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
26710 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
26720 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
26730 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
26740 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
26750 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
26760 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
26770 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
26780 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
26790 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
267a0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
267b0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
267c0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
267d0 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
267e0 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
267f0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
26800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
26810 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
26820 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
26830 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
26840 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ges.** this func
26850 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
26860 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
26870 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a  lazily populate.
26880 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
26890 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
268a0 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
268b0 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
268c0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
268d0 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
268e0 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
268f0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
26900 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
26910 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
26920 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
26930 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
26940 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
26950 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65  ated, it must be
26960 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
26970 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
26980 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
26990 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
269a0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
269b0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
269c0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
269d0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
269e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
269f0 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
26a00 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
26a10 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
26a20 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
26a30 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
26a40 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
26a50 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
26a60 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
26a70 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
26a80 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
26a90 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
26aa0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
26ab0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
26ac0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
26ad0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
26ae0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
26af0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
26b00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
26b10 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
26b20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
26b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
26b40 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
26b50 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
26b60 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
26b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26b80 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
26b90 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
26ba0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
26bb0 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
26bc0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
26bd0 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
26be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
26bf0 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
26c00 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
26c10 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
26c20 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
26c30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26c40 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
26c50 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
26c60 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
26c70 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
26c80 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61       /* Btree pa
26c90 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
26ca0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
26cb0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
26cc0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
26cd0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
26ce0 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
26cf0 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
26d00 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
26d10 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
26d20 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
26d30 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
26d40 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72  Buf;     /* Star
26d50 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75  t of original ou
26d60 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64  t buffer */.#end
26d70 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
26d80 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
26d90 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d   eOp==0 || eOp==
26da0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
26db0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26dc0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26dd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
26de0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
26df0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26e00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26e10 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
26e20 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
26e30 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
26e40 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73  o.pPayload;.  as
26e50 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
26e60 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
26e70 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73  Payload );..  as
26e80 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e  sert( aPayload >
26e90 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
26ea0 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50  .  if( (uptr)(aP
26eb0 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e  ayload - pPage->
26ec0 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75  aData) > (pBt->u
26ed0 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72  sableSize - pCur
26ee0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  ->info.nLocal) )
26ef0 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
26f00 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
26f10 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
26f20 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
26f30 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20  error.  The.    
26f40 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  ** conditional a
26f50 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a  bove is really:.
26f60 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c      **    &aPayl
26f70 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
26f80 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
26f90 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
26fa0 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62  leSize].    ** b
26fb0 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74  ut is recast int
26fc0 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f  o its current fo
26fd0 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65  rm to avoid inte
26fe0 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f  ger overflow pro
26ff0 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20  blems.    */.   
27000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27010 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
27020 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  e);.  }..  /* Ch
27030 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
27040 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
27050 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
27060 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
27070 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
27080 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27090 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
270a0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
270b0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
270c0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
270d0 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
270e0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
270f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
27100 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
27110 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
27120 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
27130 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
27140 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
27150 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
27160 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
27170 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
27180 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
27190 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66  ocal;.  }...  if
271a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
271b0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
271c0 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
271d0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
271e0 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
271f0 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
27200 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
27210 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
27220 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
27230 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
27240 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
27250 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
27260 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
27270 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
27280 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
27290 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
272a0 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  now..    **.    
272b0 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
272c0 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
272d0 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
272e0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
272f0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
27300 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
27310 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
27320 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
27330 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
27340 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
27350 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
27360 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
27370 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
27380 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
27390 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
273a0 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
273b0 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
273c0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
273d0 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
273e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
273f0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b  ValidOvfl)==0 ){
27400 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
27410 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
27420 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
27430 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
27440 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
27450 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
27460 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20 20  aOverflow==0.   
27470 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e      || nOvfl*(in
27480 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 3e  t)sizeof(Pgno) >
27490 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
274a0 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ze(pCur->aOverfl
274b0 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ow).      ){.   
274c0 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20       Pgno *aNew 
274d0 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33  = (Pgno*)sqlite3
274e0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
274f0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
27500 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69  flow, nOvfl*2*si
27510 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20  zeof(Pgno).     
27520 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
27530 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
27540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
27550 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
27560 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27570 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
27580 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
27590 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
275a0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
275b0 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
275c0 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f  , 0, nOvfl*sizeo
275d0 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  f(Pgno));.      
275e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
275f0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
27600 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27610 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
27620 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
27630 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
27640 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
27650 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  .      ** entry 
27660 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
27670 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
27680 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
27690 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72  kip.      ** dir
276a0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
276b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
276c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
276d0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
276e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78   ){.        iIdx
276f0 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
27700 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ize);.        ne
27710 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
27720 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
27730 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
27740 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
27750 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
27760 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  }..    assert( r
27770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27780 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69  amt>0 );.    whi
27790 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a  le( nextPage ){.
277a0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
277b0 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
277c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
277d0 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
277e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
277f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
27800 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dx]==0.         
27810 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f       || pCur->aO
27820 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
27830 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20  extPage.        
27840 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
27850 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75  _DB );.      pCu
27860 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27870 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a  x] = nextPage;..
27880 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
27890 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
278a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
278b0 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
278c0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
278d0 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
278e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
278f0 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
27900 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
27910 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
27920 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
27930 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
27940 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
27950 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
27960 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
27970 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
27980 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
27990 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
279a0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
279b0 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
279c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
279d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
279e0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
279f0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
27a00 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
27a10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
27a20 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e  Btree->db==pBt->
27a30 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db );.        if
27a40 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
27a50 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
27a60 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
27a70 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
27a80 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
27a90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27aa0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
27ab0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
27ac0 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
27ad0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
27ae0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
27af0 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
27b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27b10 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
27b20 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
27b30 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
27b40 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
27b50 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
27b60 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
27b70 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
27b80 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
27b90 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
27ba0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
27bb0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
27bc0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
27bd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
27be0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f       /* File fro
27bf0 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64 69  m which to do di
27c00 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72 65  rect overflow re
27c10 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  ad */.#endif.   
27c20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
27c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20  ;.        if( a 
27c40 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
27c50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
27c60 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
27c70 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
27c80 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
27c90 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
27ca0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a  _READ.        /*
27cb0 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c   If all the foll
27cc0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
27cd0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
27ce0 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20     **   1) this 
27cf0 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
27d00 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ion, and .      
27d10 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69    **   2) data i
27d20 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  s required from 
27d30 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
27d40 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  s overflow page,
27d50 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
27d60 20 20 33 29 20 74 68 65 72 65 20 69 73 20 6e 6f    3) there is no
27d70 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
27d80 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
27d90 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
27da0 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
27db0 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
27dc0 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68        **   5) th
27dd0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
27de0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20   the WAL file.  
27df0 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74        **   6) at
27e00 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
27e10 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
27e20 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
27e30 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
27e40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
27e50 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
27e60 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
27e70 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
27e80 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
27e90 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
27ea0 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
27eb0 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
27ec0 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
27ed0 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
27ee0 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
27ef0 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
27f00 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
27f10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
27f20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
27f30 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20      if( eOp==0  
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
27f70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
27f80 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fb0 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
27fc0 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
27fd0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
27fe0 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28000 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
28010 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
28020 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
28030 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
28040 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a  s     /* (4) */.
28050 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
28060 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57 61  qlite3PagerUseWa
28070 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  l(pBt->pPager, n
28080 65 78 74 50 61 67 65 29 20 20 20 20 20 20 20 2f  extPage)       /
28090 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
280a0 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
280b0 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
280e0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
280f0 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
28100 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
28110 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
28120 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
28130 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
28140 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28       /* due to (
28170 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  6) */.          
28180 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
28190 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
281a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
281b0 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
281c0 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
281d0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
281e0 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
281f0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
28200 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
28210 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28220 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
28230 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
28240 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
28250 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
28260 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
28270 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28280 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
28290 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
282a0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
282c0 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  Op==0 ? PAGER_GE
282d0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
282e0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
282f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
28300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28310 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
28320 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
28330 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
28340 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
28350 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
28360 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
28370 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
28380 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
28390 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
283a0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
283b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
283c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
283d0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
283e0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
283f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28400 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28410 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
28420 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30        if( amt==0
28430 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28440 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
28450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28460 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
28470 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20       iIdx++;.   
28480 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
28490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
284a0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  mt>0 ){.    /* O
284b0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e  verflow chain en
284c0 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a  ds prematurely *
284d0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
284e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
284f0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
28500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28510 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
28520 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20  the payload for 
28530 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63 68  the row at which
28540 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
28550 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  r is currently.*
28560 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d  * pointing.  "am
28570 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
28580 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74   transferred int
28590 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
285a0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
285b0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
285c0 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62 65  *.** pCur can be
285d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69 74   pointing to eit
285e0 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20 61  her a table or a
285f0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a  n index b-tree..
28600 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20 74  ** If pointing t
28610 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2c  o a table btree,
28620 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
28630 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61  t section is rea
28640 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20 69  d.  If.** pCur i
28650 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  s pointing to an
28660 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74 68   index b-tree th
28670 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74 69  en the key secti
28680 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  on is read..**.*
28690 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72  * For sqlite3Btr
286a0 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68 65  eePayload(), the
286b0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
286c0 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ure that pCur is
286d0 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
286e0 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20 74  a valid row in t
286f0 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 73  he table.  For s
28700 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
28710 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68 65  adChecked(), the
28720 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68 74  .** cursor might
28730 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d   be invalid or m
28740 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
28750 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20  restored before 
28760 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a  being read..**.*
28770 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
28780 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
28790 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
287a0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
287b0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
287c0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
287d0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
287e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
287f0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
28800 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
28810 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28820 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oad(BtCursor *pC
28830 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
28840 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
28850 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
28860 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28870 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
28880 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28890 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
288a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
288b0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
288c0 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
288d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
288e0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
288f0 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
28900 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
28910 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
28920 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
28930 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
28940 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74 20  ** This variant 
28950 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  of sqlite3BtreeP
28960 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20 65  ayload() works e
28970 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73 6f  ven if the curso
28980 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20  r has not.** in 
28990 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  the CURSOR_VALID
289a0 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20 6f   state.  It is o
289b0 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
289c0 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
289d0 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  d().** interface
289e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
289f0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
28a00 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  B.static SQLITE_
28a10 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63  NOINLINE int acc
28a20 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  essPayloadChecke
28a30 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
28a40 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73 65  Cur,.  u32 offse
28a50 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20 20  t,.  u32 amt,.  
28a60 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20  void *pBuf.){.  
28a70 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20 70  int rc;.  if ( p
28a80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28a90 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
28aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28ab0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73  _ABORT;.  }.  as
28ac0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
28ad0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
28ae0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52 65  ;.  rc = btreeRe
28af0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
28b00 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ion(pCur);.  ret
28b10 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61 63  urn rc ? rc : ac
28b20 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
28b30 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
28b40 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  Buf, 0);.}.int s
28b50 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
28b60 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72 73  adChecked(BtCurs
28b70 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
28b80 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
28b90 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 66  oid *pBuf){.  if
28ba0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28bb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
28bc0 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72 73      assert( curs
28bd0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
28be0 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75  Cur) );.    retu
28bf0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
28c00 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
28c10 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
28c20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
28c30 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  n accessPayloadC
28c40 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66 66  hecked(pCur, off
28c50 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b  set, amt, pBuf);
28c60 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
28c70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
28c80 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  RBLOB */../*.** 
28c90 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
28ca0 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
28cb0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
28cc0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
28cd0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
28ce0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
28cf0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
28d00 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
28d10 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
28d20 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
28d30 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
28d40 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
28d50 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
28d60 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
28d70 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
28d80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
28d90 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
28da0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
28db0 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
28dc0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
28dd0 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
28de0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
28df0 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
28e00 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
28e10 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
28e20 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
28e30 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
28e40 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
28e50 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
28e60 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
28e70 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
28e80 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
28e90 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
28ea0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
28eb0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
28ec0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
28ed0 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
28ee0 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
28ef0 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
28f00 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
28f10 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
28f20 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
28f30 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
28f40 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
28f50 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
28f60 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
28f70 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
28f80 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
28f90 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
28fa0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
28fb0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
28fc0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
28fd0 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
28fe0 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
28ff0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
29000 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
29010 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
29020 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
29030 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
29040 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
29050 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
29060 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
29070 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29080 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
29090 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
290a0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
290b0 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
290c0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
290d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
290e0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
290f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
29100 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
29110 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
29120 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
29130 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65  ->pPage);.  asse
29140 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
29150 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
29160 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29170 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29180 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
29190 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
291a0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
291b0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
291c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
291d0 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  >ix<pCur->pPage-
291e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
291f0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
29200 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Size>0 );.  asse
29210 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
29220 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70 50  Payload>pCur->pP
29230 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  age->aData || CO
29240 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
29250 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
29260 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
29270 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
29280 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20  ||CORRUPT_DB);. 
29290 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66   amt = pCur->inf
292a0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20  o.nLocal;.  if( 
292b0 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72 2d 3e  amt>(int)(pCur->
292c0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
292d0 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  - pCur->info.pPa
292e0 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f 2a  yload) ){.    /*
292f0 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20 6c 69   There is too li
29300 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68  ttle space on th
29310 65 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 65  e page for the e
29320 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a 20  xpected amount. 
29330 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20 63     ** of local c
29340 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61 73 65  ontent. Database
29350 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
29360 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
29370 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
29380 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c 20     amt = MAX(0, 
29390 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67  (int)(pCur->pPag
293a0 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  e->aDataEnd - pC
293b0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
293c0 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74  d));.  }.  *pAmt
293d0 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20 20 72   = (u32)amt;.  r
293e0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
293f0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
29400 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
29410 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
29420 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
29430 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
29440 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
29450 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
29460 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
29470 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
29480 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
29490 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
294a0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
294b0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
294c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
294d0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
294e0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
294f0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
29500 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
29510 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
29520 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
29530 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
29540 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
29550 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
29560 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
29570 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
29580 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
29590 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
295a0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
295b0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
295c0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
295d0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
295e0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
295f0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
29600 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
29610 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
29620 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
29630 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
29640 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
29650 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
29660 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74  ePayloadFetch(Bt
29670 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
29680 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
29690 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
296a0 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
296b0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
296c0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
296d0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
296e0 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
296f0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
29700 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
29710 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
29720 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
29730 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
29740 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
29750 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
29760 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
29770 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
29780 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
29790 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
297a0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
297b0 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
297c0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
297d0 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
297e0 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
297f0 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
29800 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
29810 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
29820 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
29830 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
29840 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
29850 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
29860 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
29870 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29880 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
298a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
298b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
298c0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
298d0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
298e0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
298f0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
29900 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
29910 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
29920 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
29930 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29940 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29950 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66  .  }.  pCur->inf
29960 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
29970 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
29980 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
29990 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
299a0 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  );.  pCur->aiIdx
299b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
299c0 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72  pCur->ix;.  pCur
299d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
299e0 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50  Page] = pCur->pP
299f0 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20  age;.  pCur->ix 
29a00 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
29a10 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 67  ge++;.  return g
29a20 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
29a30 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75  t, newPgno, &pCu
29a40 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2c 20  r->pPage, pCur, 
29a50 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
29a60 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  ags);.}..#ifdef 
29a70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
29a80 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
29a90 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
29aa0 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
29ab0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
29ac0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
29ad0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
29ae0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
29af0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
29b00 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
29b10 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
29b20 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
29b30 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
29b40 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
29b50 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
29b60 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
29b70 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
29b80 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
29b90 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
29ba0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
29bb0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
29bc0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
29bd0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
29be0 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f  Child){.  if( CO
29bf0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
29c00 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69  n;  /* The condi
29c10 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c  tions tested bel
29c20 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ow might not be 
29c30 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  true.           
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c50 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74   ** in a corrupt
29c60 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61   database */.  a
29c70 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
29c80 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
29c90 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
29ca0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
29cb0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
29cc0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
29cd0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
29ce0 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
29cf0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
29d00 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
29d10 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
29d20 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
29d30 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
29d40 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
29d50 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
29d60 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
29d70 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
29d80 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
29d90 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
29da0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
29db0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
29dc0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
29dd0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
29de0 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
29df0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
29e00 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
29e10 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
29e20 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
29e30 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
29e40 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
29e50 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
29e60 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
29e70 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
29e80 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
29e90 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
29ea0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
29eb0 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20  Leaf;.  assert( 
29ec0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29ed0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
29ee0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29ef0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29f10 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
29f20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
29f30 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
29f40 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
29f50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29f60 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
29f70 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
29f80 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
29f90 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d      pCur->pPage-
29fa0 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73  >pgno.  );.  tes
29fb0 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49  tcase( pCur->aiI
29fc0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
29fd0 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ] > pCur->apPage
29fe0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d  [pCur->iPage-1]-
29ff0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72  >nCell );.  pCur
2a000 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2a010 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2a020 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2a030 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2a040 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
2a050 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  ix = pCur->aiIdx
2a060 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
2a070 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d  .  pLeaf = pCur-
2a080 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  >pPage;.  pCur->
2a090 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2a0a0 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61  Page[--pCur->iPa
2a0b0 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge];.  releasePa
2a0c0 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29  geNotNull(pLeaf)
2a0d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2a0e0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
2a0f0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
2a100 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
2a110 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
2a120 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
2a130 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
2a140 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
2a150 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
2a160 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
2a170 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
2a180 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
2a190 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
2a1a0 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
2a1b0 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
2a1c0 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
2a1d0 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2a1e0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2a1f0 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
2a200 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
2a210 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
2a220 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
2a230 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2a240 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
2a250 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
2a260 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
2a270 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
2a280 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
2a290 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
2a2a0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
2a2b0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
2a2c0 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73  _EMPTY. Otherwis
2a2d0 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  e,.** the cursor
2a2e0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
2a2f0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 65   to the first ce
2a300 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
2a310 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69  e root.** (or vi
2a320 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
2a330 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
2a340 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2a350 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
2a360 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
2a370 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
2a380 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
2a390 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
2a3a0 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
2a3b0 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
2a3c0 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
2a3d0 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
2a3e0 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
2a3f0 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
2a400 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
2a410 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
2a420 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
2a430 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
2a440 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
2a450 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
2a460 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
2a470 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
2a480 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
2a490 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
2a4a0 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
2a4b0 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
2a4c0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
2a4d0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
2a4e0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
2a4f0 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
2a500 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
2a510 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
2a520 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2a530 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
2a540 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2a550 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
2a560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2a570 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2a580 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2a590 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2a5a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
2a5b0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2a5c0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2a5d0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
2a5e0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2a5f0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2a600 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
2a610 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
2a620 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2a630 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  t( pCur->eState 
2a640 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2a650 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50  SEEK || pCur->iP
2a660 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  age<0 );.  asser
2a670 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2a680 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  t>0 || pCur->iPa
2a690 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge<0 );..  if( p
2a6a0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
2a6b0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
2a6c0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Page ){.      re
2a6d0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
2a6e0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
2a6f0 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43       while( --pC
2a700 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
2a710 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2a720 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
2a730 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a740 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2a750 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
2a760 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2a770 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70  .      goto skip
2a780 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  _init;.    }.  }
2a790 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70  else if( pCur->p
2a7a0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  gnoRoot==0 ){.  
2a7b0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2a7c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2a7d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a7e0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73  TE_EMPTY;.  }els
2a7f0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2a800 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29  Cur->iPage==(-1)
2a810 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
2a820 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
2a830 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
2a840 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2a850 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2a860 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AULT ){.        
2a870 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2a880 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
2a890 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  K );.        ret
2a8a0 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
2a8b0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2a8c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
2a8d0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
2a8e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2a8f0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2a900 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
2a910 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2a920 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a  , &pCur->pPage,.
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a940 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d          0, pCur-
2a950 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
2a960 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2a970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a980 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2a990 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2a9a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2a9b0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2a9c0 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70  iPage = 0;.    p
2a9d0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d  Cur->curIntKey =
2a9e0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e   pCur->pPage->in
2a9f0 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
2aa00 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  t = pCur->pPage;
2aa10 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
2aa20 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
2aa30 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
2aa40 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
2aa50 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
2aa60 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
2aa70 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
2aa80 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
2aa90 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
2aaa0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
2aab0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
2aac0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
2aad0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
2aae0 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
2aaf0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
2ab00 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
2ab10 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
2ab20 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
2ab30 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
2ab40 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
2ab50 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
2ab60 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
2ab70 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
2ab80 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
2ab90 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
2aba0 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
2abb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2abc0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
2abd0 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
2abe0 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
2abf0 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
2ac00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2ac10 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
2ac20 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
2ac30 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
2ac40 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
2ac50 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
2ac60 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
2ac70 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
2ac80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
2ac90 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
2aca0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
2acb0 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
2acc0 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
2acd0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2ace0 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
2acf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ad00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2ad10 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  GE(pCur->pPage);
2ad20 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a  .  }..skip_init:
2ad30 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20    .  pCur->ix = 
2ad40 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
2ad50 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2ad60 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2ad70 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2ad80 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2ad90 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
2ada0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50  pRoot = pCur->pP
2adb0 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  age;.  if( pRoot
2adc0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
2add0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2ade0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2adf0 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
2ae00 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
2ae10 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
2ae20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
2ae30 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
2ae40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ae50 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
2ae60 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
2ae70 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
2ae80 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2ae90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2aea0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2aeb0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2aec0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
2aed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2aee0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2aef0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2af00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d    rc = SQLITE_EM
2af10 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  PTY;.  }.  retur
2af20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2af30 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2af40 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
2af50 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
2af60 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
2af70 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
2af80 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2af90 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
2afa0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
2afb0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
2afc0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
2afd0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
2afe0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
2aff0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2b000 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
2b010 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2b020 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2b030 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b040 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2b050 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2b060 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2b070 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2b080 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2b090 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2b0a0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2b0b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b0c0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
2b0d0 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
2b0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b0f0 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65  r->ix<pPage->nCe
2b100 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
2b110 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
2b120 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2b130 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ix));.    rc = m
2b140 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2b150 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
2b160 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b170 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2b180 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
2b190 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
2b1a0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
2b1b0 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
2b1c0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2b1d0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
2b1e0 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
2b1f0 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
2b200 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
2b210 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
2b220 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
2b230 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
2b240 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
2b250 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
2b260 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
2b270 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2b280 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
2b290 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2b2a0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
2b2b0 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
2b2c0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
2b2d0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
2b2e0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
2b2f0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
2b300 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
2b310 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2b320 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
2b330 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2b340 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2b350 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b360 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2b370 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
2b380 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b390 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b3a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b3b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b3c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
2b3d0 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70  ile( !(pPage = p
2b3e0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
2b3f0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
2b400 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2b410 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2b420 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2b430 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67   pCur->ix = pPag
2b440 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
2b450 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2b460 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
2b470 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2b480 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
2b490 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ix = pPage->nCel
2b4a0 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l-1;.  assert( p
2b4b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2b4c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b4d0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2b4e0 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
2b4f0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2b500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2b510 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2b520 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
2b530 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2b540 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2b550 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
2b560 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
2b570 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
2b580 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
2b590 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
2b5a0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
2b5b0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
2b5c0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2b5d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
2b5e0 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
2b5f0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2b600 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
2b610 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2b620 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2b630 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b640 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2b650 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2b660 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
2b670 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2b680 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2b690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2b6a0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2b6b0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
2b6c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2b6d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
2b6e0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
2b6f0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2b700 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
2b710 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2b720 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2b730 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2b740 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
2b750 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
2b760 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
2b770 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2b780 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2b790 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2b7a0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2b7b0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2b7c0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2b7d0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2b7e0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2b7f0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2b800 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2b810 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2b820 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2b830 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2b840 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
2b850 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2b860 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2b870 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
2b880 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2b890 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2b8a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2b8b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2b8c0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2b8d0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
2b8e0 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
2b8f0 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
2b900 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
2b910 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
2b920 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
2b930 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2b940 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  e && (pCur->curF
2b950 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2b960 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  st)!=0 ){.#ifdef
2b970 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2b980 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
2b990 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
2b9a0 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
2b9b0 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
2b9c0 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
2b9d0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2b9e0 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
2b9f0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
2ba00 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
2ba10 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
2ba20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ba30 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
2ba40 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
2ba50 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2ba60 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2ba70 75 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50  ur->ix==pCur->pP
2ba80 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  age->nCell-1 );.
2ba90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2baa0 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ->pPage->leaf );
2bab0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2bac0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bad0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2bae0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2baf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bb00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2bb10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2bb20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
2bb30 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2bb40 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2bb50 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2bb60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bb70 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
2bb80 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2bb90 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65  F_AtLast;.    }e
2bba0 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
2bbb0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2bbc0 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d  CF_AtLast;.    }
2bbd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2bbe0 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b  =SQLITE_EMPTY ){
2bbf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2bc00 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2bc10 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  | pCur->pPage->n
2bc20 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
2bc30 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  pRes = 1;.    rc
2bc40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2bc50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2bc60 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2bc70 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
2bc80 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
2bc90 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
2bca0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
2bcb0 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
2bcc0 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
2bcd0 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
2bce0 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
2bcf0 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
2bd00 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
2bd10 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
2bd20 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
2bd30 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2bd40 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
2bd50 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
2bd60 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
2bd70 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
2bd80 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
2bd90 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
2bda0 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
2bdb0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2bdc0 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
2bdd0 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
2bde0 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
2bdf0 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
2be00 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
2be10 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
2be20 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
2be30 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
2be40 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
2be50 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
2be60 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
2be70 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
2be80 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
2be90 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
2bea0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
2beb0 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
2bec0 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
2bed0 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
2bee0 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
2bef0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
2bf00 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
2bf10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2bf20 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
2bf30 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2bf40 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2bf50 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2bf60 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
2bf70 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
2bf80 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
2bf90 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2bfa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2bfb0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
2bfc0 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
2bfd0 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
2bfe0 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
2bff0 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
2c000 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2c010 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2c020 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c040 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2c050 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2c060 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
2c070 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2c080 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2c090 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2c0a0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2c0b0 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
2c0c0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2c0d0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  dxKey..**.** For
2c0e0 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74   index tables, t
2c0f0 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65  he pIdxKey->eqSe
2c100 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  en field is set 
2c110 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a  to 1 if there.**
2c120 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79   exists an entry
2c130 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
2c140 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  at exactly match
2c150 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f  es pIdxKey.  .*/
2c160 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2c170 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
2c180 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2c190 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
2c1a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
2c1b0 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
2c1c0 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
2c1d0 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
2c1e0 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
2c1f0 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
2c200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2c210 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
2c220 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
2c230 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2c240 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
2c250 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
2c260 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
2c270 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2c280 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
2c290 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
2c2a0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2c2b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52  RecordCompare xR
2c2c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20  ecordCompare;.. 
2c2d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2c2e0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2c2f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c300 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c310 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2c320 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2c330 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
2c340 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
2c350 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
2c360 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20  KeyInfo==0) );. 
2c370 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2c380 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2c390 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d  LID || (pIdxKey=
2c3a0 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49  =0)==(pCur->curI
2c3b0 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20  ntKey!=0) );..  
2c3c0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2c3d0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
2c3e0 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
2c3f0 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
2c400 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
2c410 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
2c420 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2c430 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
2c440 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20  if( pIdxKey==0. 
2c450 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
2c460 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c470 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2c480 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2c490 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  Key)!=0.  ){.   
2c4a0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2c4b0 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2c4c0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2c4d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2c4e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2c4f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2c500 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
2c510 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72  .      if( (pCur
2c520 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2c530 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
2c540 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2c550 2d 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  -1;.        retu
2c560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c570 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49      }.      /* I
2c580 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
2c590 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20  key is one more 
2c5a0 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
2c5b0 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20  s key, then.    
2c5c0 20 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20    ** try to get 
2c5d0 74 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69  there using sqli
2c5e0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 72  te3BtreeNext() r
2c5f0 61 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c  ather than a ful
2c600 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72  l.      ** binar
2c610 79 20 73 65 61 72 63 68 2e 20 20 54 68 69 73 20  y search.  This 
2c620 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2c630 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f  on only.  The co
2c640 72 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20  rrect answer.   
2c650 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f     ** is still o
2c660 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20  btained without 
2c670 74 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20  this case, only 
2c680 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c  a little more sl
2c690 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69  owely */.      i
2c6a0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2c6b0 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20  ey+1==intKey && 
2c6c0 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20  !pCur->skipNext 
2c6d0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2c6e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2c6f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
2c700 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ext(pCur, 0);.  
2c710 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c730 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
2c740 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  (pCur);.        
2c750 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2c760 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
2c770 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2c780 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c7a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2c7b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
2c7c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2c7d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c7f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2c810 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2c820 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
2c830 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2c840 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
2c850 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
2c860 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
2c870 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
2c880 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
2c890 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
2c8a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2c8b0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2c8c0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
2c8d0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2c8e0 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
2c8f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
2c900 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
2c910 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
2c920 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
2c930 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2c940 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2c950 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  rc ){.    if( rc
2c960 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29  ==SQLITE_EMPTY )
2c970 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c980 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2c990 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65  0 || pCur->pPage
2c9a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2c9b0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2c9c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2c9d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2c9e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2c9f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2ca00 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
2ca10 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
2ca20 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
2ca30 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ca40 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2ca50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ca60 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2ca70 3e 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  > 0 );.  assert(
2ca80 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2ca90 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2caa0 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72  0]->intKey==pCur
2cab0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
2cac0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2cad0 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  urIntKey || pIdx
2cae0 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
2caf0 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
2cb00 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20  pr, idx, c;.    
2cb10 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
2cb20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2cb30 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2cb40 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb60 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2cb70 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
2cb80 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
2cb90 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
2cba0 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
2cbb0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
2cbc0 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
2cbd0 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
2cbe0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
2cbf0 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
2cc00 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
2cc10 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
2cc20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
2cc30 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2cc40 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
2cc50 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
2cc60 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
2cc70 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
2cc80 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
2cc90 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
2cca0 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
2ccb0 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
2ccc0 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
2ccd0 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
2cce0 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
2ccf0 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
2cd00 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
2cd10 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
2cd20 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
2cd30 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
2cd40 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
2cd50 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
2cd60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2cd70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
2cd80 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
2cd90 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
2cda0 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
2cdb0 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  ll-1;.    assert
2cdc0 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c  ( biasRight==0 |
2cdd0 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29  | biasRight==1 )
2cde0 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e  ;.    idx = upr>
2cdf0 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20  >(1-biasRight); 
2ce00 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67  /* idx = biasRig
2ce10 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b  ht ? upr : (lwr+
2ce20 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70  upr)/2; */.    p
2ce30 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2ce40 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63  dx;.    if( xRec
2ce50 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ordCompare==0 ){
2ce60 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2ce70 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
2ce80 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
2ce90 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2cea0 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2ceb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2cec0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
2ced0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2cee0 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70  ile( 0x80 <= *(p
2cef0 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20  Cell++) ){.     
2cf00 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2cf10 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  >=pPage->aDataEn
2cf20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
2cf30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cf40 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
2cf50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2cf60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2cf70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cf80 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
2cf90 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
2cfa0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2cfb0 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
2cfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2cfd0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2cfe0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2cff0 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
2d000 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2d010 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
2d020 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2d030 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2d040 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2d050 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
2d060 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2d070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d080 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2d090 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
2d0a0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d0b0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2d0c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2d0d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d0e0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2d0f0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx;.            
2d100 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74  goto moveto_next
2d110 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20  _layer;.        
2d120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d130 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2d140 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
2d150 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  dNKey;.         
2d160 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
2d170 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
2d180 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2d190 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2d1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
2d1b0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2d1c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d1d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2d1e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d1f0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2d200 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2d210 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2d220 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2d230 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2d240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2d250 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
2d260 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
2d270 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ell;  /* Size of
2d280 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20   the pCell cell 
2d290 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2d2a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2d2b0 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2d2c0 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  e, idx);..      
2d2d0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
2d2e0 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
2d2f0 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
2d300 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
2d310 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2d320 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2d330 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
2d340 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
2d350 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
2d360 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
2d370 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
2d380 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
2d390 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
2d3a0 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
2d3b0 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
2d3c0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
2d3d0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
2d3e0 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
2d3f0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
2d400 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
2d410 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
2d420 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
2d430 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
2d440 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
2d450 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
2d460 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
2d470 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
2d480 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
2d490 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
2d4a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2d4b0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
2d4c0 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
2d4d0 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
2d4e0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
2d4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2d500 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
2d510 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
2d520 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
2d530 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
2d540 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
2d550 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2d560 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
2d570 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2d580 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
2d590 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2d5a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2d5b0 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2d5c0 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
2d5d0 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2d5e0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2d5f0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2d600 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
2d610 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2d620 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
2d630 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
2d640 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
2d650 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
2d660 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
2d670 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
2d680 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
2d690 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d6a0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2d6b0 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
2d6c0 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2d6d0 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
2d6e0 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
2d6f0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
2d700 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2d710 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2d720 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
2d730 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2d740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2d750 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2d760 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2d770 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
2d780 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2d790 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2d7a0 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
2d7b0 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
2d7c0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
2d7d0 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
2d7e0 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
2d7f0 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
2d800 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
2d810 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
2d820 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
2d830 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
2d840 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
2d850 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
2d860 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
2d870 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
2d880 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
2d890 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
2d8a0 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
2d8b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2d8c0 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
2d8d0 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
2d8e0 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
2d8f0 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
2d900 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
2d910 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
2d920 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
2d930 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
2d940 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
2d950 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
2d960 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
2d970 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
2d980 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
2d990 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
2d9a0 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
2d9b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2d9c0 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
2d9d0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
2d9e0 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
2d9f0 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
2da00 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
2da10 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
2da20 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
2da30 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
2da40 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
2da50 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
2da60 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
2da70 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2da80 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
2da90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65     /* True if ke
2daa0 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f  y size is 2^32 o
2dab0 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
2dac0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2dad0 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e  ell==0 );  /* In
2dae0 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2daf0 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20   0x80 0x80 0x00 
2db00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2db10 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20  tcase( nCell==1 
2db20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2db30 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2db40 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20  x80 0x01 */.    
2db50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2db60 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20  nCell==2 );  /* 
2db70 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e  Minimum legal in
2db80 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a  dex key size */.
2db90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43            if( nC
2dba0 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  ell<2 ){.       
2dbb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2dbc0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
2dbd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2dbe0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2dbf0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2dc00 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2dc10 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2dc20 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2dc30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2dc40 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2dc50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2dc60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2dc70 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2dc80 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2dc90 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2dca0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2dcb0 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2dcc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
2dcd0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2dce0 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
2dcf0 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
2dd00 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
2dd10 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2dd20 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
2dd30 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Ovfl;.          
2dd40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2dd50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2dd60 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
2dd70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2dd80 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2dd90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dda0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2ddb0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
2ddc0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
2ddd0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2dde0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2ddf0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
2de00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20        assert( . 
2de10 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78             (pIdx
2de20 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2de30 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
2de40 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26  c==0).         &
2de50 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  & (pIdxKey->errC
2de60 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ode!=SQLITE_NOME
2de70 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65  M || pCur->pBtre
2de80 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2de90 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  led).        );.
2dea0 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20          if( c<0 
2deb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2dec0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2ded0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20    }else if( c>0 
2dee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2def0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2df00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2df10 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20     assert( c==0 
2df20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  );.          *pR
2df30 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2df40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2df50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2df60 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2df70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2df80 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2df90 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
2dfa0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2dfb0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2dfc0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2dfd0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2dfe0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2dff0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e000 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2e010 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2e020 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2e030 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2e040 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2e050 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2e060 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2e070 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2e080 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2e090 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e0a0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2e0b0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2e0c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2e0d0 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
2e0e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2e0f0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
2e100 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2e110 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
2e120 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2e130 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
2e140 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2e150 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
2e160 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
2e170 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2e180 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2e190 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2e1a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2e1b0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2e1c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2e1d0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2e1e0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2e1f0 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
2e200 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2e210 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
2e220 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2e230 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
2e240 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2e250 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
2e260 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
2e270 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Size = 0;.  asse
2e280 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2e290 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2e2a0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65  Ovfl)==0 );.  re
2e2b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2e2c0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2e2d0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2e2e0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
2e2f0 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2e300 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
2e310 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
2e320 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
2e330 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
2e340 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
2e350 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
2e360 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
2e370 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2e380 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
2e390 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
2e3a0 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
2e3b0 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
2e3c0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2e3d0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2e3e0 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
2e3f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
2e400 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
2e410 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
2e420 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2e430 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
2e440 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
2e450 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
2e460 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
2e470 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
2e480 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2e490 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
2e4a0 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
2e4b0 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
2e4c0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
2e4d0 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
2e4e0 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
2e4f0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73  .** Return an es
2e500 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e  timate for the n
2e510 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2e520 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
2e530 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74  pCur is.** point
2e540 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20  ing to.  Return 
2e550 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2e560 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65  r if no estimate
2e570 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a   is currently .*
2e580 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  * available..*/.
2e590 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
2e5a0 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75  RowCountEst(BtCu
2e5b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2e5c0 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20  64 n;.  u8 i;.. 
2e5d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2e5e0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2e5f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2e600 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e610 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2e620 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2e630 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68   /* Currently th
2e640 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  is interface is 
2e650 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74  only called by t
2e660 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a  he OP_IfSmaller.
2e670 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64    ** opcode, and
2e680 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74 68   it that case th
2e690 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c  e cursor will al
2e6a0 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e  ways be valid an
2e6b0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61  d.  ** will alwa
2e6c0 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65  ys point to a le
2e6d0 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
2e6e0 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53  ( NEVER(pCur->eS
2e6f0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2e700 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ID) ) return -1;
2e710 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
2e720 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  r->pPage->leaf==
2e730 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0) ) return -1;.
2e740 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61  .  n = pCur->pPa
2e750 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72  ge->nCell;.  for
2e760 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50  (i=0; i<pCur->iP
2e770 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  age; i++){.    n
2e780 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65   *= pCur->apPage
2e790 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  [i]->nCell;.  }.
2e7a0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
2e7b0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2e7c0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2e7d0 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2e7e0 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52   database. .** R
2e7f0 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a  eturn value:.**.
2e800 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  **    SQLITE_OK 
2e810 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a         success.*
2e820 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45  *    SQLITE_DONE
2e830 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73 20        cursor is 
2e840 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2e850 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65   at the last ele
2e860 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72  ment.**    other
2e870 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65  wise        some
2e880 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
2e890 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
2e8a0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2e8b0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2e8c0 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
2e8d0 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2e8e0 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2e8f0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2e900 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
2e910 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2e920 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2e930 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
2e940 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
2e950 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2e960 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
2e970 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
2e980 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2e990 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2e9a0 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2e9b0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2e9c0 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
2e9d0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2e9e0 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
2e9f0 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
2ea00 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ent in sqlite3Bt
2ea10 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20  reeNext(C,F) is 
2ea20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63  1, then the.** c
2ea30 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2ea40 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2ea50 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
2ea60 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2ea70 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
2ea80 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
2ea90 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
2eaa0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
2eab0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
2eac0 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
2ead0 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62  ement.  SQLite b
2eae0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2eaf0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ion does not use
2eb00 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62  .** this hint, b
2eb10 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
2eb20 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2eb30 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2eb40 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2eb50 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
2eb60 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2eb70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2eb80 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2eb90 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2eba0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2ebb0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2ebc0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2ebd0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2ebe0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2ebf0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ec00 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2ec10 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2ec20 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2ec30 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2ec40 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2ec50 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ec60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ec70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ec80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ec90 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2eca0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2ecb0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2ecc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2ecd0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
2ece0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2ecf0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2ed00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ed10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2ed20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ed30 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2ed40 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2ed50 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2ed60 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2ed70 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2ed80 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2ed90 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2eda0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2edb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2edc0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2edd0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2ede0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2edf0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64  Cur->pPage;.  id
2ee00 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a  x = ++pCur->ix;.
2ee10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2ee20 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
2ee30 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2ee40 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
2ee50 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2ee60 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
2ee70 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
2ee80 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
2ee90 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
2eea0 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
2eeb0 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
2eec0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
2eed0 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
2eee0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
2eef0 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
2ef00 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
2ef10 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2ef20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
2ef30 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
2ef40 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
2ef50 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
2ef60 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
2ef70 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
2ef80 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
2ef90 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
2efa0 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70  );..  if( idx>=p
2efb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2efc0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2efd0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2efe0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2eff0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
2f000 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2f010 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
2f020 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2f030 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f040 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2f050 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2f060 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
2f070 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2f080 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
2f090 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2f0a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2f0b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f0c0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
2f0d0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2f0e0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2f0f0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2f100 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68  ->pPage;.    }wh
2f110 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70  ile( pCur->ix>=p
2f120 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2f130 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2f140 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2f150 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2f160 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a  eNext(pCur, 0);.
2f170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f190 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2f1a0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2f1b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2f1c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2f1d0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2f1e0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2f1f0 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2f200 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2f210 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2f220 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61   flags){.  MemPa
2f230 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e 55  ge *pPage;.  UNU
2f240 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66  SED_PARAMETER( f
2f250 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64  lags );  /* Used
2f260 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e   in COMDB2 but n
2f270 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65  ot native SQLite
2f280 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 75   */.  assert( cu
2f290 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2f2a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2f2b0 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
2f2c0 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73  flags==1 );.  as
2f2d0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2f2e0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2f2f0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2f300 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
2f310 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2f320 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2f330 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2f340 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2f350 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75  Ovfl);.  if( pCu
2f360 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2f370 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2f380 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29   btreeNext(pCur)
2f390 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2f3a0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 28  ->pPage;.  if( (
2f3b0 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61  ++pCur->ix)>=pPa
2f3c0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2f3d0 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
2f3e0 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2f3f0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69  t(pCur);.  }.  i
2f400 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2f410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2f420 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2f430 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2f440 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2f450 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2f460 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
2f470 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
2f480 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
2f490 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f4a0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75  ..** Return valu
2f4b0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  es:.**.**     SQ
2f4c0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63  LITE_OK     succ
2f4d0 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ess.**     SQLIT
2f4e0 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72  E_DONE   the cur
2f4f0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f  sor is already o
2f500 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  n the first elem
2f510 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
2f520 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73  .**     otherwis
2f530 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20  e     some kind 
2f540 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  of error occurre
2f550 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  d.**.** The main
2f560 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2f570 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2f580 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
2f590 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2f5a0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2f5b0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2f5c0 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
2f5d0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2f5e0 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2f5f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
2f600 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
2f610 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2f620 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2f630 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
2f640 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
2f650 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2f660 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2f670 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2f680 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
2f690 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2f6a0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
2f6b0 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
2f6c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
2f6d0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2f6e0 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65  s(C,F) is 1, the
2f6f0 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  n.** the cursor 
2f700 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2f710 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
2f720 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2f730 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ld have been.** 
2f740 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 53  skipped if the S
2f750 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2f760 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  n a unique index
2f770 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e  .  The F argumen
2f780 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74  t is a.** hint t
2f790 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e  o the implement.
2f7a0 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c    The native SQL
2f7b0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2f7c0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2f7d0 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69  t.** use this hi
2f7e0 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
2f7f0 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
2f800 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2f810 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
2f820 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2f830 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
2f840 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2f850 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2f860 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2f870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2f880 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2f890 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2f8a0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2f8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2f8c0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2f8d0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2f8e0 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
2f8f0 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b  alidNKey))==0 );
2f900 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2f910 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2f920 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2f930 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f940 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  ID ){.    rc = r
2f950 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2f960 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2f970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f980 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2f990 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2f9a0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2f9b0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2f9c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f9d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2f9e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2f9f0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2fa00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2fa10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2fa20 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2fa30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2fa40 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2fa50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2fa60 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2fa70 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2fa80 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
2fa90 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2faa0 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2fab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fad0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2fae0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2faf0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
2fb00 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2fb10 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2fb20 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2fb30 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
2fb40 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20  dx = pCur->ix;. 
2fb50 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2fb60 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
2fb70 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2fb80 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
2fb90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2fba0 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
2fbb0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2fbc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2fbd0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d  while( pCur->ix=
2fbe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2fbf0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2fc00 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2fc10 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2fc20 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2fc30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
2fc40 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
2fc50 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2fc60 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2fc70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2fc80 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2fc90 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2fca0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2fcb0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
2fcc0 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
2fcd0 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  >ix--;.    pPage
2fce0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2fcf0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2fd00 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2fd10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2fd20 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2fd30 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 30  Previous(pCur, 0
2fd40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2fd50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2fd60 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2fd70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2fd80 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2fd90 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2fda0 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29  pCur, int flags)
2fdb0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2fdc0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2fdd0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2fde0 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
2fdf0 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ags==1 );.  asse
2fe00 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2fe10 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2fe20 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2fe30 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  LID );.  UNUSED_
2fe40 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73  PARAMETER( flags
2fe50 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20   );  /* Used in 
2fe60 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e  COMDB2 but not n
2fe70 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a  ative SQLite */.
2fe80 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2fe90 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2fea0 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2feb0 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2fec0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2fed0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
2fee0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2fef0 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
2ff00 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20   pCur->ix==0.   
2ff10 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
2ff20 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  leaf==0.  ){.   
2ff30 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65   return btreePre
2ff40 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20 7d  vious(pCur);.  }
2ff50 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20  .  pCur->ix--;. 
2ff60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ff70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
2ff80 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
2ff90 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2ffa0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
2ffb0 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
2ffc0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
2ffd0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
2ffe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2fff0 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
30000 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
30010 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
30020 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
30030 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
30040 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
30050 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
30060 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
30070 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
30080 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
30090 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
300a0 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
300b0 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
300c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
300d0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
300e0 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
300f0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
30100 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
30110 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
30120 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65   NULL in the eve
30130 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
30140 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
30150 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
30160 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
30170 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
30180 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
30190 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
301a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
301b0 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
301c0 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
301d0 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
301e0 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
301f0 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
30200 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
30210 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
30220 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
30230 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
30240 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
30250 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65  .** If the eMode
30260 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54   parameter is BT
30270 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
30280 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20  the nearby page 
30290 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65  exists.** anywhe
302a0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
302b0 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
302c0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
302d0 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a   returned.  If.*
302e0 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  * eMode is BTALL
302f0 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70  OC_LT then the p
30300 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
30310 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  l be less than o
30320 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65  r equal.** to ne
30330 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68  arby if any such
30340 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49   page exists.  I
30350 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  f eMode is BTALL
30360 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72  OC_ANY then ther
30370 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74  e.** are no rest
30380 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63  rictions on whic
30390 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e  h page is return
303a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
303b0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
303c0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
303d0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pBt,         /*
303e0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
303f0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
30400 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
30410 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
30420 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65  llocated page he
30430 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  re */.  Pgno *pP
30440 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
30450 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65  * Store the page
30460 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
30470 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20    Pgno nearby,  
30480 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
30490 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65  ch for a page ne
304a0 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ar this one */. 
304b0 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20   u8 eMode       
304c0 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c          /* BTALL
304d0 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f  OC_EXACT, BTALLO
304e0 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43  C_LT, or BTALLOC
304f0 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  _ANY */.){.  Mem
30500 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
30510 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
30520 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30530 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
30540 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
30550 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
30560 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
30570 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
30580 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
30590 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
305a0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
305b0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
305c0 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
305d0 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
305e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
305f0 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
30600 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30610 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
30620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d   );.  assert( eM
30630 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
30640 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26   || (nearby>0 &&
30650 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
30660 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29  ->autoVacuum)) )
30670 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
30680 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
30690 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
306a0 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45  unt(pBt);.  /* E
306b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35  VIDENCE-OF: R-05
306c0 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d  119-02637 The 4-
306d0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
306e0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
306f0 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73  t 36.  ** stores
30700 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61   stores the tota
30710 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
30720 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
30730 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34  t. */.  n = get4
30740 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
30750 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
30760 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
30770 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
30780 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
30790 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
307a0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
307b0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
307c0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
307d0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
307e0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
307f0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
30800 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
30810 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
30820 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
30830 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
30840 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
30850 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
30860 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b  u32 nSearch = 0;
30870 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74     /* Count of t
30880 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61  he number of sea
30890 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a  rch attempts */.
308a0 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65      .    /* If e
308b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
308c0 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20  ACT and a query 
308d0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
308e0 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
308f0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
30900 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
30910 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
30920 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
30930 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
30940 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
30950 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
30960 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
30970 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30980 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
30990 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
309a0 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66  XACT ){.      if
309b0 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  ( nearby<=mxPage
309c0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
309d0 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Type;.        as
309e0 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
309f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30a00 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
30a10 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m );.        rc 
30a20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
30a30 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
30a40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
30a50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30a60 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
30a70 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
30a80 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
30a90 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
30aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30ab0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
30ac0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
30ad0 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
30ae0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
30af0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
30b00 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
30b10 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
30b20 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
30b30 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
30b40 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
30b50 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
30b60 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
30b70 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
30b80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
30b90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30ba0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
30bb0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
30bc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30bd0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
30be0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
30bf0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
30c00 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
30c10 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
30c20 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
30c30 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
30c40 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
30c50 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
30c60 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
30c70 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
30c80 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
30c90 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
30ca0 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
30cb0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
30cc0 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
30cd0 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72  EXACT).    ** or
30ce0 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65   until a page le
30cf0 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27  ss than 'nearby'
30d00 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
30d10 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a  de==BTALLOC_LT).
30d20 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
30d30 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
30d40 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
30d50 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
30d60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
30d70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35  IDENCE-OF: R-015
30d80 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72  06-11053 The fir
30d90 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  st integer on a 
30da0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
30db0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  age.        ** i
30dc0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
30dd0 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72  r of the next fr
30de0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
30df0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72  e in the list or
30e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  .        ** zero
30e10 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
30e20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72  last freelist tr
30e30 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  unk page. */.   
30e40 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
30e50 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
30e60 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
30e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30e80 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
30e90 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39  OF: R-59841-1379
30ea0 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  8 The 4-byte big
30eb0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
30ec0 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20  at offset 32.   
30ed0 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74       ** stores t
30ee0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
30ef0 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
30f00 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
30f10 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20  , or zero if.   
30f20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
30f30 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a  list is empty. *
30f40 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
30f50 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
30f60 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
30f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
30f80 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
30f90 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
30fa0 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
30fb0 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20  ge || nSearch++ 
30fc0 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  > n ){.        r
30fd0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
30fe0 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72 75  PT_PGNO(pPrevTru
30ff0 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b 2d  nk ? pPrevTrunk-
31000 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20 20  >pgno : 1);.    
31010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31020 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
31030 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54  usedPage(pBt, iT
31040 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
31050 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31060 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
31070 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
31080 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31090 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
310a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
310b0 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
310c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
310d0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
310e0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   );.      /* EVI
310f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32  DENCE-OF: R-1352
31100 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f  3-04394 The seco
31110 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  nd integer on a 
31120 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
31130 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
31140 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
31150 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  af page pointers
31160 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20   to follow. */. 
31170 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
31180 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
31190 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
311a0 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
311b0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
311c0 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
311d0 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
311e0 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
311f0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
31200 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
31210 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
31220 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
31230 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
31240 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
31250 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
31260 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31270 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
31280 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
31290 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
312a0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
312b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
312c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
312d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
312e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
312f0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
31300 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
31310 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
31320 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
31330 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31340 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
31350 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
31360 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
31370 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
31380 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
31390 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
313a0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
313b0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
313c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
313d0 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
313e0 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
313f0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
31400 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
31410 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
31420 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
31430 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31440 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69  E_CORRUPT_PGNO(i
31450 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
31460 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31470 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
31480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31490 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
314a0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
314b0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
314c0 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
314d0 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
314e0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
314f0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
31500 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
31510 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
31520 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
31530 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
31540 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
31550 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
31560 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
31570 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
31580 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
31590 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
315a0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
315b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
315c0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
315d0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
315e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
315f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
31600 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
31610 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
31620 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
31630 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31640 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
31650 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
31660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
31670 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
31680 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
31690 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
316a0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
316b0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
316c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
316d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
316e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
316f0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
31700 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
31710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31730 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31740 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
31750 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31760 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
31770 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
31780 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
31790 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
317a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
317b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
317c0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
317d0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
317e0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
317f0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
31800 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
31810 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
31820 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
31830 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
31840 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
31850 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
31860 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
31870 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
31880 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
31890 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
318a0 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
318b0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
318c0 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
318d0 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
318e0 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
318f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31900 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
31910 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
31920 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31930 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31960 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
31970 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
31980 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
31990 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  edPage(pBt, iNew
319a0 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
319b0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
319c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
319d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
319e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
319f0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
31a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31a10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31a20 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
31a30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31a40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31a50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31a60 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
31a70 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
31a80 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31a90 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31aa0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
31ab0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
31ac0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
31ad0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
31ae0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
31af0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
31b00 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
31b10 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
31b20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
31b30 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
31b40 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
31b50 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
31b60 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
31b70 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
31b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31b90 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
31bb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
31bc0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
31bd0 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
31be0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
31bf0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
31c00 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
31c10 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
31c20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31c40 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
31c50 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
31c60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
31c70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
31c80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31c90 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31cb0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
31cc0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
31cd0 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
31ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
31d00 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
31d10 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
31d20 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
31d30 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
31d40 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
31d50 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
31d60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
31d70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
31d80 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
31d90 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
31da0 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
31db0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
31dc0 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
31dd0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
31de0 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
31df0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
31e00 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
31e10 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
31e20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
31e30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31e40 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
31e50 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
31e60 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
31e70 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
31e80 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
31e90 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
31ea0 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  8+i*4]);.       
31eb0 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
31ec0 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  <=nearby ){.    
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
31ee0 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
31ef0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
31f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
31f10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31f20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31f30 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
31f40 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
31f50 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41   dist = sqlite3A
31f60 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
31f70 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
31f80 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
31f90 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
31fa0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
31fb0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
31fc0 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
31fd0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
31fe0 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  i*4]) - nearby);
31ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
32000 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
32010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
32020 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
32030 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
32040 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
32050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32060 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
32070 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32080 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
32090 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
320a0 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
320b0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
320c0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
320d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
320e0 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
320f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
32100 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
32110 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32120 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
32130 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
32140 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32150 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
32170 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
32180 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
32190 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
321a0 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  t .         || (
321b0 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c  iPage==nearby ||
321c0 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26   (iPage<nearby &
321d0 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
321e0 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29  _LE)) .        )
321f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
32200 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
32210 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
32220 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
32230 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
32240 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
32250 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
32260 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
32270 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
32280 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
32290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
322a0 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
322b0 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
322c0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
322d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
322e0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
322f0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
32300 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
32310 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32320 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32330 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
32340 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
32350 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
32360 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
32370 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
32380 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32390 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
323a0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
323b0 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
323c0 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
323d0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
323e0 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45  pPgno)? PAGER_GE
323f0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
32400 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32410 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
32420 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
32430 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
32440 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
32450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
32470 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32480 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
32490 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
324a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
324b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
324c0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
324d0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
324e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
324f0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
32500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
32520 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
32530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32540 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
32550 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
32560 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
32570 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
32580 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
32590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
325a0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
325b0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
325c0 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
325d0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
325e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
325f0 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
32600 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
32610 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
32620 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
32630 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
32640 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
32650 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
32660 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
32670 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
32680 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
32690 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
326a0 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
326b0 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
326c0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
326d0 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
326e0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
326f0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
32700 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
32710 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
32720 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
32730 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
32740 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
32750 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
32760 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
32770 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
32780 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
32790 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
327a0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
327b0 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
327c0 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
327d0 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
327e0 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
327f0 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
32800 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
32810 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
32820 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
32830 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
32840 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
32850 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
32860 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
32870 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
32880 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
32890 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
328a0 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
328b0 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
328c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
328d0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
328e0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
328f0 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
32900 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
32910 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
32920 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
32930 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
32940 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
32950 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
32960 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
32970 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
32980 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
32990 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
329a0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
329b0 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
329c0 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
329d0 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
329e0 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  te))? PAGER_GET_
329f0 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20  NOCONTENT:0;..  
32a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32a10 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
32a20 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
32a30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
32a40 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
32a50 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
32a60 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
32a70 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
32a80 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
32a90 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
32aa0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32ab0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
32ac0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
32ad0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
32ae0 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
32af0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
32b00 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
32b10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
32b20 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
32b30 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
32b40 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
32b50 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
32b60 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
32b70 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
32b80 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
32b90 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
32ba0 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
32bb0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
32bc0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
32bd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
32be0 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
32bf0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
32c00 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
32c10 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
32c20 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
32c30 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
32c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
32c50 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
32c60 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
32c70 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
32c80 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
32c90 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
32ca0 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
32cb0 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
32cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32cd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32ce0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32cf0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
32d00 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
32d10 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
32d20 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
32d30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
32d40 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
32d50 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
32d60 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
32d70 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
32d80 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
32d90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32da0 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
32db0 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
32dc0 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
32dd0 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
32de0 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
32df0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
32e00 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
32e10 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
32e20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
32e30 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
32e40 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
32e50 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
32e60 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
32e70 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
32e80 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
32e90 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
32ea0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32eb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32ec0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
32ed0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
32ee0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Page = 0;.    }.
32ef0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
32f00 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
32f10 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
32f20 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
32f30 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
32f40 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
32f50 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
32f60 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
32f70 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
32f80 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
32f90 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
32fa0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
32fb0 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
32fc0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
32fd0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
32fe0 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61  bPage)<=1 );.  a
32ff0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
33000 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65  E_OK || (*ppPage
33010 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  )->isInit==0 );.
33020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33030 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
33040 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
33050 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
33060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33070 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
33080 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
33090 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
330a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
330b0 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
330c0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
330d0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
330e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
330f0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
33100 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
33110 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
33120 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
33130 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
33140 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
33150 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
33160 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
33170 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
33180 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
33190 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
331a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
331b0 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
331c0 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
331d0 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
331e0 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
331f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
33200 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
33210 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
33220 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
33230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
33240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
33250 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
33260 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
33270 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
33280 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
33290 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
332a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
332b0 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
332c0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
332d0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
332e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
332f0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
33300 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
33310 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
33320 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
33330 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
33340 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
33350 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
33360 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
33370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33380 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
33390 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
333a0 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
333b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
333c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333d0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
333e0 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33400 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
33410 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
33420 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
33430 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
33440 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
33450 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
33460 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
33470 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20  T_DB || iPage>1 
33480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
33490 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
334a0 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
334b0 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c  );..  if( iPage<
334c0 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  2 ) return SQLIT
334d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
334e0 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
334f0 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
33500 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
33510 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
33520 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
33530 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
33540 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
33550 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
33560 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
33570 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
33580 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
33590 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
335a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
335b0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
335c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
335d0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
335e0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
335f0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
33600 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
33610 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
33620 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
33630 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
33640 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
33650 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
33660 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
33670 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
33680 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
33690 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
336a0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
336b0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
336c0 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
336d0 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
336e0 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
336f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
33700 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
33710 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
33720 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
33730 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33740 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
33750 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
33760 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
33770 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
33780 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
33790 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
337a0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
337b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
337c0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
337d0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
337e0 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
337f0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
33800 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
33810 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
33820 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
33830 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
33840 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
33850 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
33860 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
33870 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
33880 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
33890 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
338a0 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
338b0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
338c0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
338d0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
338e0 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
338f0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
33900 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
33910 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
33920 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
33930 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
33940 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
33950 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
33960 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
33970 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
33980 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
33990 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
339a0 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
339b0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
339c0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
339d0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
339e0 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
339f0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
33a00 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
33a10 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
33a20 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
33a30 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
33a40 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
33a50 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
33a60 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
33a70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
33a80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
33a90 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
33aa0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
33ab0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
33ac0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
33ad0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
33ae0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
33af0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
33b00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
33b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33b20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
33b30 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
33b40 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
33b50 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
33b60 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
33b70 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
33b80 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
33b90 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
33ba0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
33bb0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
33bc0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33bd0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
33be0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
33bf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
33c00 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
33c10 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
33c20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
33c30 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
33c40 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
33c50 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
33c60 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
33c70 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
33c80 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
33c90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33ca0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
33cb0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
33cc0 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
33cd0 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
33ce0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
33cf0 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
33d00 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
33d10 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
33d20 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
33d30 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
33d40 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
33d50 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
33d60 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
33d70 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
33d80 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
33d90 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
33da0 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
33db0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
33dc0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
33dd0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
33de0 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
33df0 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
33e00 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
33e10 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
33e20 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
33e30 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
33e40 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
33e50 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
33e60 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
33e70 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
33e80 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
33e90 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
33ea0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
33eb0 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
33ec0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
33ed0 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
33ee0 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
33ef0 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
33f00 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
33f10 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
33f20 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
33f30 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
33f40 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
33f50 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
33f60 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
33f70 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a  /4-8"..      **.
33f80 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
33f90 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31  E-OF: R-19920-11
33fa0 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77  576 However, new
33fb0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
33fc0 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20  QLite still.    
33fd0 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67    ** avoid using
33fe0 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e   the last six en
33ff0 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65  tries in the fre
34000 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
34010 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20   array in.      
34020 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61  ** order that da
34030 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
34040 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  ated by newer ve
34050 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
34060 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a   can be.      **
34070 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76   read by older v
34080 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
34090 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
340a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
340b0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
340c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
340d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
340e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
340f0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
34100 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
34110 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
34120 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
34130 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
34140 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
34150 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
34160 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
34170 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
34180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
34190 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
341a0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
341b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
341c0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
341d0 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
341e0 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
341f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
34200 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
34210 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
34220 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
34230 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
34240 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
34250 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
34270 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
34280 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
34290 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
342a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
342b0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
342c0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
342d0 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
342e0 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
342f0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
34300 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
34310 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
34320 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
34330 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
34340 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
34350 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
34360 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
34370 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
34380 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
34390 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
343a0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
343b0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
343c0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
343d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
343e0 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
343f0 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
34400 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
34410 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
34420 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
34430 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
34440 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34450 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
34460 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
34470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34480 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
34490 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
344a0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
344b0 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
344c0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
344d0 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
344e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
344f0 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
34500 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
34510 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
34520 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
34530 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
34540 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
34550 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
34560 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
34570 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
34580 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
34590 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
345a0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
345b0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
345c0 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
345d0 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
345e0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
345f0 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
34600 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
34610 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
34620 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
34630 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
34640 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
34650 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
34660 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
34670 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
34680 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53 74   given Cell.  St
34690 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66 6f  ore.** size info
346a0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
346b0 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f 2e  e cell in pInfo.
346c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
346d0 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
346e0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
346f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
34700 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
34710 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
34720 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
34730 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
34740 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
34750 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
34760 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a  Info          /*
34770 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   Size informatio
34780 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c  n about the cell
34790 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
347a0 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f  d *pBt;.  Pgno o
347b0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
347c0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
347d0 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
347e0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
347f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34800 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
34810 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
34820 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
34830 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
34840 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e  ;.  if( pInfo->n
34850 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50  Local==pInfo->nP
34860 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65  ayload ){.    re
34870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
34880 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
34890 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
348a0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
348b0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
348c0 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e  ( pCell+pInfo->n
348d0 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e  Size-1 > pPage->
348e0 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
348f0 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20  kPage ){.    /* 
34900 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73  Cell extends pas
34910 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f  t end of page */
34920 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34930 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
34940 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 6f 76  pPage);.  }.  ov
34950 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
34960 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d  e(pCell + pInfo-
34970 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 70  >nSize - 4);.  p
34980 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
34990 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
349a0 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
349b0 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
349c0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
349d0 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
349e0 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  = (pInfo->nPaylo
349f0 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  ad - pInfo->nLoc
34a00 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
34a10 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
34a20 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
34a30 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28  Ovfl>0 || .    (
34a40 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70  CORRUPT_DB && (p
34a50 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b  Info->nPayload +
34a60 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f   ovflPageSize)<o
34a70 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29  vflPageSize).  )
34a80 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
34a90 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
34aa0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
34ab0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
34ac0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
34ad0 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
34ae0 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
34af0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
34b00 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
34b10 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
34b20 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
34b30 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
34b40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
34b50 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
34b60 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
34b70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
34b80 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
34b90 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
34ba0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
34bb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34bc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34bd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
34be0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
34bf0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
34c00 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
34c10 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
34c20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
34c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34c40 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
34c50 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
34c60 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
34c70 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
34c80 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
34c90 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
34ca0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
34cb0 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
34cc0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
34cd0 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
34ce0 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
34cf0 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
34d00 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
34d10 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
34d20 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
34d30 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
34d40 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
34d50 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
34d60 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
34d70 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
34d80 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
34d90 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
34da0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
34db0 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
34dc0 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
34dd0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
34de0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
34df0 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
34e00 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
34e10 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
34e20 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
34e30 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
34e40 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
34e50 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
34e60 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
34e70 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
34e80 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
34e90 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
34ea0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
34eb0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
34ec0 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
34ed0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
34ee0 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
34ef0 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
34f00 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
34f10 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
34f20 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
34f30 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
34f40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
34f50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
34f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
34f70 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
34f80 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
34f90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
34fa0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
34fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34fc0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
34fd0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
34fe0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
34ff0 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
35000 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
35010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35020 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
35030 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
35040 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
35050 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
35060 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
35070 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
35080 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
35090 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
350a0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
350b0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
350c0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
350d0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
350e0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
350f0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
35100 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
35110 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
35120 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
35130 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
35140 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
35150 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
35160 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
35170 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
35180 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
35190 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
351a0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
351b0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
351c0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
351d0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
351e0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
351f0 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
35200 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
35210 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
35220 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
35230 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
35240 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
35250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35260 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
35270 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
35280 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
35290 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
352a0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
352b0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
352c0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72  l */.  const Btr
352d0 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20  eePayload *pX,  
352e0 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64        /* Payload
352f0 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63   with which to c
35300 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c  onstruct the cel
35310 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  l */.  int *pnSi
35320 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
35330 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
35340 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
35350 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
35360 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
35370 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
35380 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20 69  , n, rc, mn;.  i
35390 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
353a0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
353b0 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ase;.  unsigned 
353c0 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
353d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
353e0 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
353f0 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f  red *pBt;.  Pgno
35400 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e 74   pgnoOvfl;.  int
35410 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73   nHeader;..  ass
35420 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
35430 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
35440 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
35450 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
35460 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
35470 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
35480 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
35490 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
354a0 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
354b0 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
354c0 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
354d0 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
354e0 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
354f0 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
35500 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
35510 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
35520 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
35530 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
35540 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
35550 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
35560 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
35570 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
35580 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c  er = pPage->chil
35590 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20  dPtrSize;.  if( 
355a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
355b0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
355c0 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e  pX->nData + pX->
355d0 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20  nZero;.    pSrc 
355e0 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20  = pX->pData;.   
355f0 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74   nSrc = pX->nDat
35600 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
35610 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
35620 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c   ); /* fillInCel
35630 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  l() only called 
35640 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  for leaves */.  
35650 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
35660 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
35670 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
35680 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72  ad);.    nHeader
35690 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
356a0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
356b0 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29  (u64*)&pX->nKey)
356c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
356d0 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c  ssert( pX->nKey<
356e0 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
356f0 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20  X->pKey!=0 );.  
35700 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61    nSrc = nPayloa
35710 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65  d = (int)pX->nKe
35720 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58  y;.    pSrc = pX
35730 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61  ->pKey;.    nHea
35740 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
35750 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
35760 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
35770 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20   }.  .  /* Fill 
35780 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
35790 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  /.  pPayload = &
357a0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
357b0 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
357c0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
357d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
357e0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
357f0 65 20 77 68 65 72 65 20 65 76 65 72 79 74 68 69  e where everythi
35800 6e 67 20 66 69 74 73 20 6f 6e 20 74 68 65 20 62  ng fits on the b
35810 74 72 65 65 20 70 61 67 65 0a 20 20 20 20 2a 2a  tree page.    **
35820 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66 6c 6f 77   and no overflow
35830 20 70 61 67 65 73 20 61 72 65 20 72 65 71 75 69   pages are requi
35840 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d 20  red. */.    n = 
35850 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f  nHeader + nPaylo
35860 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ad;.    testcase
35870 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65  ( n==3 );.    te
35880 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a  stcase( n==4 );.
35890 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20      if( n<4 ) n 
358a0 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = 4;.    *pnSize
358b0 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   = n;.    assert
358c0 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f 61 64  ( nSrc<=nPayload
358d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
358e0 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f 61 64 20  ( nSrc<nPayload 
358f0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
35900 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 53  ayload, pSrc, nS
35910 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  rc);.    memset(
35920 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63 2c 20 30  pPayload+nSrc, 0
35930 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53 72 63 29  , nPayload-nSrc)
35940 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
35950 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
35960 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
35970 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
35980 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 6f 66 20  ns that some of 
35990 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  the content will
359a0 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 73 70   need.  ** to sp
359b0 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill onto overflo
359c0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
359d0 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  mn = pPage->minL
359e0 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20 2b  ocal;.  n = mn +
359f0 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
35a00 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
35a10 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
35a20 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
35a30 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
35a40 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
35a50 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
35a60 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 20 3e  l+1 );.  if( n >
35a70 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
35a80 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70 61   ) n = mn;.  spa
35a90 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 2a 70  ceLeft = n;.  *p
35aa0 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61  nSize = n + nHea
35ab0 64 65 72 20 2b 20 34 3b 0a 20 20 70 50 72 69 6f  der + 4;.  pPrio
35ac0 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  r = &pCell[nHead
35ad0 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c 65  er+n];.  pToRele
35ae0 61 73 65 20 3d 20 30 3b 0a 20 20 70 67 6e 6f 4f  ase = 0;.  pgnoO
35af0 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42 74 20 3d  vfl = 0;.  pBt =
35b00 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
35b10 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
35b20 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c   variables shoul
35b30 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c  d be set as foll
35b40 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
35b50 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   nPayload       
35b60 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61      Total payloa
35b70 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  d size in bytes.
35b80 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20    **   pPayload 
35b90 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
35ba0 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20  writing payload 
35bb0 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63  here.  **   spac
35bc0 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53  eLeft          S
35bd0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
35be0 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20  t pPayload.  If 
35bf0 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65  nPayload>spaceLe
35c00 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ft,.  **        
35c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
35c20 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74  at means content
35c30 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f   must spill into
35c40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
35c50 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20  .  **   *pnSize 
35c60 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
35c70 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  of the local cel
35c80 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  l (not counting 
35c90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a  overflow pages).
35ca0 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20    **   pPrior   
35cb0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
35cc0 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e  to write the pgn
35cd0 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  o of the first o
35ce0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a  verflow page.  *
35cf0 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c  *.  ** Use a cal
35d00 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  l to btreeParseC
35d10 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69  ellPtr() to veri
35d20 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  fy that the valu
35d30 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65  es above.  ** we
35d40 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72  re computed corr
35d50 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64  ectly..  */.#ifd
35d60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
35d70 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
35d80 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65   info;.    pPage
35d90 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
35da0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
35db0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
35dc0 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e  Header==(int)(in
35dd0 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
35de0 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
35df0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70  rt( info.nKey==p
35e00 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  X->nKey );.    a
35e10 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
35e20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
35e30 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
35e40 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
35e50 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ocal );.  }.#end
35e60 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
35e70 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
35e80 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
35e90 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
35ea0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
35eb0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
35ec0 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  {.    n = nPaylo
35ed0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
35ee0 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
35ef0 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
35f00 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
35f10 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
35f20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
35f30 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
35f40 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
35f50 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
35f60 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
35f70 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
35f80 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
35f90 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
35fa0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
35fb0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
35fc0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
35fd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
35fe0 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
35ff0 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
36000 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
36010 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
36020 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
36030 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
36040 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
36050 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
36060 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
36070 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
36080 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
36090 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
360a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
360b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
360c0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
360d0 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =n ){.      memc
360e0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
360f0 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
36100 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
36110 20 20 20 20 20 6e 20 3d 20 6e 53 72 63 3b 0a 20       n = nSrc;. 
36120 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
36130 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
36140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36150 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
36160 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
36170 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
36180 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 79 6c 6f  ;.    if( nPaylo
36190 61 64 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ad<=0 ) break;. 
361a0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
361b0 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
361c0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
361d0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
361e0 20 6e 3b 0a 20 20 20 20 69 66 28 20 73 70 61 63   n;.    if( spac
361f0 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eLeft==0 ){.    
36200 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
36210 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
36220 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
36230 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
36240 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
36250 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
36260 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
36270 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
36280 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
36290 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
362a0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
362b0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
362c0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
362d0 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
362e0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
362f0 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
36300 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
36310 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
36320 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
36330 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
36340 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
36350 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
36360 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
36370 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
36380 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36390 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
363a0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
363b0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
363c0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
363d0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
363e0 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
363f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
36400 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
36410 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
36420 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
36430 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
36440 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
36450 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
36460 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
36470 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
36480 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
36490 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
364a0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
364b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
364c0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
364d0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
364e0 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
364f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
36500 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
36510 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
36520 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
36530 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
36540 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
36550 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
36560 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
36570 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
36580 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
36590 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
365a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
365b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
365c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
365d0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
365e0 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
365f0 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
36600 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
36610 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
36620 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
36630 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
36640 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
36650 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
36660 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
36670 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
36680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36690 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
366a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
366b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
366c0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
366d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
366e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
366f0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
36700 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
36710 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
36720 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
36730 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
36740 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
36750 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
36760 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
36770 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
36780 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
36790 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
367a0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
367b0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
367c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
367d0 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
367e0 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
367f0 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
36800 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
36810 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
36820 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
36830 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
36840 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
36850 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
36860 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
36870 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
36880 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
36890 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
368a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
368b0 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
368c0 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
368d0 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
368e0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
368f0 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
36900 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
36910 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
36920 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
36930 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
36940 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
36950 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
36960 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
36970 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
36980 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
36990 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
369a0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
369b0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
369c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
369d0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
369e0 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
369f0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
36a00 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
36a10 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
36a20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
36a30 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
36a40 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
36a50 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
36a60 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
36a70 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
36a80 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
36a90 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
36aa0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
36ab0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
36ac0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
36ad0 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
36ae0 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
36af0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
36b00 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
36b10 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
36b20 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
36b30 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
36b40 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
36b50 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
36b60 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
36b70 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
36b80 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
36b90 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
36ba0 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
36bb0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
36bc0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
36bd0 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
36be0 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
36bf0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
36c00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
36c10 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
36c20 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
36c30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
36c40 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
36c50 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
36c60 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
36c70 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
36c80 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
36c90 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
36ca0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
36cb0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a  CORRUPT_DB || sz
36cc0 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
36cd0 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
36ce0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36cf0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
36d00 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
36d10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36d20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
36d30 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
36d40 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
36d50 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
36d60 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
36d70 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  x[2*idx];.  pc =
36d80 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
36d90 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
36da0 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
36db0 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
36dc0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
36dd0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
36de0 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
36df0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
36e00 0a 20 20 69 66 28 20 70 63 2b 73 7a 20 3e 20 70  .  if( pc+sz > p
36e10 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
36e20 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52  eSize ){.    *pR
36e30 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
36e40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
36e50 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
36e60 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
36e70 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
36e80 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  rc ){.    *pRC =
36e90 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
36ea0 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
36eb0 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61  ell--;.  if( pPa
36ec0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
36ed0 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
36ee0 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
36ef0 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
36f00 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74  = 0;.    put2byt
36f10 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
36f20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
36f30 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  leSize);.    pPa
36f40 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
36f50 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
36f60 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f  ze - pPage->hdrO
36f70 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20  ffset.          
36f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70               - p
36f90 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
36fa0 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b  ze - 8;.  }else{
36fb0 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72  .    memmove(ptr
36fc0 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67  , ptr+2, 2*(pPag
36fd0 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29  e->nCell - idx))
36fe0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
36ff0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
37000 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
37010 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
37020 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2;.  }.}../*.** 
37030 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
37040 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
37050 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
37060 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
37070 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
37080 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
37090 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
370a0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
370b0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
370c0 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
370d0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
370e0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
370f0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
37100 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
37110 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
37120 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
37130 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
37140 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
37150 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
37160 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20  pPage->apOvfl[] 
37170 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
37180 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
37190 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
371a0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
371b0 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
371c0 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
371d0 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
371e0 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
371f0 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
37200 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
37210 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
37220 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
37230 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
37240 20 2a 70 52 43 20 6d 75 73 74 20 62 65 20 53 51   *pRC must be SQ
37250 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
37260 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
37270 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
37280 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
37290 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
372a0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
372b0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
372c0 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
372d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
372e0 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
372f0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
37300 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
37310 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
37320 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
37330 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
37340 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
37350 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
37360 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
37370 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
37380 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
37390 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
373a0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
373b0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
373c0 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
373d0 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
373e0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
373f0 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
37400 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
37410 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
37420 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
37430 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
37440 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
37450 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
37460 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
37470 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
37480 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
37490 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
374a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
374b0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
374c0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
374d0 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
374e0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49  page */.  u8 *pI
374f0 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ns;         /* T
37500 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67  he point in pPag
37510 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68  e->aCellIdx[] wh
37520 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65  ere no cell inse
37530 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rted */..  asser
37540 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f  t( *pRC==SQLITE_
37550 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
37560 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
37570 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
37580 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
37590 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50  sert( MX_CELL(pP
375a0 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
375b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
375c0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
375d0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
375e0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
375f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37600 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
37610 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
37620 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
37630 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61  t( ArraySize(pPa
37640 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72  ge->apOvfl)==Arr
37650 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69  aySize(pPage->ai
37660 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
37670 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
37680 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
37690 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
376a0 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
376b0 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
376c0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
376d0 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
376e0 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
376f0 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
37700 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
37710 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
37720 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
37730 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
37740 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
37750 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
37760 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
37770 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
37780 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
37790 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
377a0 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
377b0 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
377c0 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
377d0 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
377e0 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
377f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
37800 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
37810 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  ==pPage->xCellSi
37820 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ze(pPage, pCell)
37830 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43   || (sz==8 && iC
37840 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28  hild>0) );.  if(
37850 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
37860 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
37870 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
37880 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
37890 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70   memcpy(pTemp, p
378a0 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20  Cell, sz);.     
378b0 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
378c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
378d0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
378e0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
378f0 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
37900 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
37910 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 2f 2a 20  rflow++;.    /* 
37920 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  Comparison again
37930 73 74 20 41 72 72 61 79 53 69 7a 65 2d 31 20 73  st ArraySize-1 s
37940 69 6e 63 65 20 77 65 20 68 6f 6c 64 20 62 61 63  ince we hold bac
37950 6b 20 6f 6e 65 20 65 78 74 72 61 20 73 6c 6f 74  k one extra slot
37960 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 63 6f 6e  .    ** as a con
37970 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e 20 6f 74  tingency.  In ot
37980 68 65 72 20 77 6f 72 64 73 2c 20 6e 65 76 65 72  her words, never
37990 20 6e 65 65 64 20 6d 6f 72 65 20 74 68 61 6e 20   need more than 
379a0 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a  3 overflow.    *
379b0 2a 20 73 6c 6f 74 73 20 62 75 74 20 34 20 61 72  * slots but 4 ar
379c0 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 6a 75 73  e allocated, jus
379d0 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 2a 2f  t to be safe. */
379e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c  .    assert( j <
379f0 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65   ArraySize(pPage
37a00 2d 3e 61 70 4f 76 66 6c 29 2d 31 20 29 3b 0a 20  ->apOvfl)-1 );. 
37a10 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
37a20 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
37a30 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
37a40 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20  ] = (u16)i;..   
37a50 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c   /* When multipl
37a60 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75  e overflows occu
37a70 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77 61  r, they are alwa
37a80 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e  ys sequential an
37a90 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74  d in.    ** sort
37aa0 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ed order.  This 
37ab0 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73 65  invariants arise
37ac0 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c   because multipl
37ad0 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a  e overflows can.
37ae0 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75      ** only occu
37af0 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  r when inserting
37b00 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
37b10 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
37b20 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a  age during.    *
37b30 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64  * balancing, and
37b40 20 74 68 65 20 64 69 76 69 64 65 72 73 20 61 72   the dividers ar
37b50 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73  e adjacent and s
37b60 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  orted..    */.  
37b70 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c    assert( j==0 |
37b80 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b  | pPage->aiOvfl[
37b90 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f  j-1]<(u16)i ); /
37ba0 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73  * Overflows in s
37bb0 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20  orted order */. 
37bc0 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20     assert( j==0 
37bd0 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f  || i==pPage->aiO
37be0 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20  vfl[j-1]+1 );   
37bf0 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65  /* Overflows are
37c00 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20   sequential */. 
37c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
37c20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37c30 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
37c40 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
37c50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37c60 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
37c70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
37c80 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
37c90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
37ca0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
37cb0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
37cc0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
37cd0 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
37ce0 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  ( &data[pPage->c
37cf0 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67  ellOffset]==pPag
37d00 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20  e->aCellIdx );. 
37d10 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
37d20 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
37d30 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
37d40 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
37d50 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
37d60 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
37d70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
37d80 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
37d90 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65  lowing propertie
37da0 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72  s.    ** if it r
37db0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
37dc0 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  lly */.    asser
37dd0 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20  t( idx >= 0 );. 
37de0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
37df0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
37e00 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
37e10 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll+2 || CORRUPT_
37e20 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
37e30 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74  ( idx+sz <= (int
37e40 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
37e50 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
37e60 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
37e70 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
37e80 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
37e90 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  dx], pCell, sz);
37ea0 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
37eb0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
37ec0 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
37ed0 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
37ee0 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61   pIns = pPage->a
37ef0 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20  CellIdx + i*2;. 
37f00 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b     memmove(pIns+
37f10 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67  2, pIns, 2*(pPag
37f20 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a  e->nCell - i));.
37f30 20 20 20 20 70 75 74 32 62 79 74 65 28 70 49 6e      put2byte(pIn
37f40 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61  s, idx);.    pPa
37f50 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
37f60 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   /* increment th
37f70 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a  e cell count */.
37f80 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b      if( (++data[
37f90 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
37fa0 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70  +4])==0 ) data[p
37fb0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
37fc0 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  3]++;.    assert
37fd0 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ( get2byte(&data
37fe0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
37ff0 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43  t+3])==pPage->nC
38000 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ell );.#ifndef S
38010 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
38020 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
38030 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
38040 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
38050 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
38060 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
38070 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
38080 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
38090 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
380a0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
380b0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
380c0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
380d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
380e0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
380f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
38100 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
38110 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
38120 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63   CellArray objec
38130 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63  t contains a cac
38140 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61  he of pointers a
38150 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a  nd sizes for a.*
38160 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65  * consecutive se
38170 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20  quence of cells 
38180 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 68 65  that might be he
38190 6c 64 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 70  ld on multiple p
381a0 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ages..*/.typedef
381b0 20 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61   struct CellArra
381c0 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72  y CellArray;.str
381d0 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a  uct CellArray {.
381e0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
381f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
38200 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
38210 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65  apCell[] */.  Me
38220 6d 50 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20  mPage *pRef;    
38230 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e        /* Referen
38240 63 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ce page */.  u8 
38250 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
38260 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
38270 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
38280 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
38290 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
382a0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
382b0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
382c0 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ll[] */.};../*.*
382d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
382e0 63 65 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64  cell sizes at id
382f0 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69  x, idx+1, ..., i
38300 64 78 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e  dx+N-1 have been
38310 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f  .** computed..*/
38320 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70  .static void pop
38330 75 6c 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43  ulateCellCache(C
38340 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
38350 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20   idx, int N){.  
38360 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
38370 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c  & idx+N<=p->nCel
38380 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e  l );.  while( N>
38390 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
383a0 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21   p->apCell[idx]!
383b0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
383c0 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20  >szCell[idx]==0 
383d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65  ){.      p->szCe
383e0 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65  ll[idx] = p->pRe
383f0 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e  f->xCellSize(p->
38400 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b  pRef, p->apCell[
38410 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  idx]);.    }else
38420 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
38430 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20  CORRUPT_DB ||.  
38440 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73              p->s
38450 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70  zCell[idx]==p->p
38460 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
38470 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
38480 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d  l[idx]) );.    }
38490 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20 2