/ Hex Artifact Content
Login

Artifact 9eb9531c65346bbfccf5325384b7db1849daf4db6601dcfe21ba5c5b20623b64:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5a40: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5a50: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5a60: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
5a70: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
5a80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
5a90: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5aa0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5ac0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5ad0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5ae0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5b10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5b40: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5b50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5b70: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
5b80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5b90: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5ba0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5bd0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5be0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5bf0: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5c00: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5c10: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5c20: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5c30: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5c40: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5c50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
5c60: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5c70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5c80: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5c90: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5ca0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5cb0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5cc0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5cd0: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5cf0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5d00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5d10: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5d20: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5d30: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5d40: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5d50: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
5d60: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5d70: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d80: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5d90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5da0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5db0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5dd0: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5de0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5df0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5e00: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5e10: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e30: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5e40: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5e50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5e60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5e70: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5e80: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5e90: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ea0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5eb0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5ee0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5ef0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5f00: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5f10: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5f20: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5f40: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5f50: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5f60: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5f70: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5f80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5f90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5fa0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5fb0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5fc0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5fd0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5fe0: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5ff0: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
6000: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
6010: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
6020: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
6030: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
6040: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
6050: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
6060: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
6070: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
6080: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
60a0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
60b0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
60c0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
60d0: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
60e0: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
60f0: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
6100: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
6110: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
6120: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
6130: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
6140: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
6150: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
6160: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
6170: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
6180: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
6190: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
61a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
61b0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
61c0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
61d0: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
61e0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
61f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
6200: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
6210: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
6220: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
6230: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
6240: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
6250: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6260: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
6270: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
6280: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
6290: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
62a0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
62b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
62c0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
62d0: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
62e0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
62f0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
6300: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
6310: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
6320: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6330: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
6340: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
6350: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
6360: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
6370: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
6380: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6390: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
63a0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
63b0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
63c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
63d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
63e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
63f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6400: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6410: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6420: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6430: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6440: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6450: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6460: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6470: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6480: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
6490: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
64a0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
64b0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
64c0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
64d0: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
64e0: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
64f0: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6520: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6530: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6540: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6550: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
6560: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
6570: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
6580: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
6590: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
65a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
65b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
65c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
65d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
65e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
65f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6600: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6610: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6620: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6630: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6650: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6660: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6670: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6690: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
66a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
66b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
66d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
66e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
66f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6700: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6710: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6720: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6730: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6740: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6750: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6760: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6770: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6780: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6790: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
67a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
67b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
67c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
67d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
67e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
67f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6810: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6840: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
6850: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
6860: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6870: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
6880: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
6890: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
68a0: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
68d0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
68e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
68f0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
6900: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
6910: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
6920: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6930: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
6940: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6950: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
6960: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
6970: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6980: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
6990: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
69a0: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
69b0: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
69c0: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
69d0: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
69e0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
69f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
6a00: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
6a10: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
6a20: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
6a30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
6a40: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
6a70: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
6a80: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
6a90: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
6aa0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
6ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
6ac0: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
6ad0: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
6ae0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
6af0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
6b00: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
6b10: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
6b20: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
6b30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
6b40: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
6b50: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
6b60: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6b90: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
6ba0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6bd0: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
6be0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
6bf0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
6c00: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
6c10: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
6c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6c30: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6c40: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6c60: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6c70: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
6c80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6c90: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6ca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cc0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6cd0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6ce0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6cf0: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6d00: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6d20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6d30: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
6d40: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
6d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6d60: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6d70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6d80: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6d90: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6da0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6db0: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6dc0: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6dd0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6de0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6df0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6e00: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6e20: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6e30: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6e40: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6e50: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6e60: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6e70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6e80: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6e90: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6ea0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6eb0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6ec0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6ed0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6ee0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6ef0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6f00: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6f10: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6f20: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6f30: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6f60: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6f70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6f90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6fa0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6fb0: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6fc0: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6fd0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6fe0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6ff0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
7000: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
7010: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
7020: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
7030: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
7040: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
7050: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
7060: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
7070: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
7080: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
7090: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
70a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
70b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
70c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
70d0: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
70e0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
70f0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
7100: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7110: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
7120: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
7130: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
7140: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
7150: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
7160: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
7170: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7180: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
71a0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
71c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
71d0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
71e0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
71f0: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
7200: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7210: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
7220: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
7230: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
7240: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7250: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
7260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
7270: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
7280: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
7290: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
72a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
72b0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
72c0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
72d0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
72e0: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
72f0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
7300: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
7310: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
7320: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
7330: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
7340: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
7350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
7360: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
7370: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
7380: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
7390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
73a0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
73b0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
73c0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
73d0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
73e0: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
73f0: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7400: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7410: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7420: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7430: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
7440: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
7450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7460: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7470: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
7480: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
7490: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
74a0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
74b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
74c0: 72 20 74 6f 20 61 20 66 61 6b 65 20 42 74 43 75  r to a fake BtCu
74d0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 68 61 74  rsor object that
74e0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73   will always ans
74f0: 77 65 72 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20  wer.** false to 
7500: 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
7510: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
7520: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 20   routine above. 
7530: 20 54 68 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72   The fake.** cur
7540: 73 6f 72 20 72 65 74 75 72 6e 65 64 20 6d 75 73  sor returned mus
7550: 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  t not be used wi
7560: 74 68 20 61 6e 79 20 6f 74 68 65 72 20 42 74 72  th any other Btr
7570: 65 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ee interface..*/
7580: 0a 42 74 43 75 72 73 6f 72 20 2a 73 71 6c 69 74  .BtCursor *sqlit
7590: 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c 69 64  e3BtreeFakeValid
75a0: 43 75 72 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20  Cursor(void){.  
75b0: 73 74 61 74 69 63 20 75 38 20 66 61 6b 65 43 75  static u8 fakeCu
75c0: 72 73 6f 72 20 3d 20 43 55 52 53 4f 52 5f 56 41  rsor = CURSOR_VA
75d0: 4c 49 44 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  LID;.  assert( o
75e0: 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
75f0: 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a  , eState)==0 );.
7600: 20 20 72 65 74 75 72 6e 20 28 42 74 43 75 72 73    return (BtCurs
7610: 6f 72 2a 29 26 66 61 6b 65 43 75 72 73 6f 72 3b  or*)&fakeCursor;
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7630: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
7640: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
7650: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
7660: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7670: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7680: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7690: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
76a0: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
76b0: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
76c0: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
76d0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
76e0: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
76f0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7700: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
7710: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
7720: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
7730: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
7740: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
7750: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
7760: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7770: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7780: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7790: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
77a0: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
77b0: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
77c0: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
77d0: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
77e0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
77f0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7800: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
7810: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
7820: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
7830: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
7840: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
7850: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
7860: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7870: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7880: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7890: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
78a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78b0: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
78c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
78d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
78e0: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
78f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7900: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
7910: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
7920: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7940: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
7950: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
7960: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7970: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7990: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
79a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
79b0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
79c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
79d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
79e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
79f0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7a00: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
7a10: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
7a20: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
7a30: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
7a40: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
7a50: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
7a60: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7a70: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7a80: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7a90: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
7aa0: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
7ab0: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
7ac0: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
7ad0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
7ae0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7af0: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7b00: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
7b10: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
7b20: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
7b30: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
7b40: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
7b50: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
7b60: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7b70: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7b80: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7b90: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
7ba0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7bb0: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
7bc0: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
7bd0: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
7be0: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
7bf0: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7c00: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
7c10: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
7c20: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
7c30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7c40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
7c50: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
7c60: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7c70: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7c80: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7c90: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7ca0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
7cb0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
7cc0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
7cd0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
7ce0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
7cf0: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7d00: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
7d10: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
7d20: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
7d30: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
7d40: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
7d50: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7d60: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7d70: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7d80: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7d90: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7da0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7db0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7dc0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7dd0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7de0: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7df0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7e00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7e10: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7e20: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
7e30: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
7e40: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
7e50: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7e60: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7e70: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7e80: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7e90: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7ea0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7eb0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7ec0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7ed0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7ee0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7ef0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7f00: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7f10: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7f20: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7f30: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7f40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7f50: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7f60: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7f70: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7f80: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7f90: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7fa0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7fb0: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7fc0: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7fd0: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7fe0: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7ff0: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
8000: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
8010: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
8020: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
8030: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
8040: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
8050: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8060: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
8070: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
8080: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
8090: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
80a0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
80b0: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
80c0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
80d0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
80e0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
80f0: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
8100: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
8110: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8120: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
8130: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8140: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
8150: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
8160: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
8170: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
8180: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
8190: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
81a0: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
81b0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
81c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81d0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
81e0: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
81f0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
8200: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
8210: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
8220: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8230: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
8240: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
8250: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
8260: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
8270: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
8280: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
8290: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
82a0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
82b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
82c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
82d0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
82e0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
82f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8300: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
8310: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
8320: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
8330: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8340: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
8350: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
8360: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
8370: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
8380: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
8390: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
83a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
83b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
83c0: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
83d0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
83e0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
83f0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8400: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
8410: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8420: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8430: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
8440: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
8450: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
8460: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8470: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
8480: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
8490: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
84a0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
84b0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
84c0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
84d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
84e0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
84f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8500: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
8510: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
8520: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
8530: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8540: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
8550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
8560: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
8570: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8580: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
8590: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
85a0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
85b0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
85c0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
85d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
85e0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
85f0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
8600: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
8610: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8620: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
8630: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
8640: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
8650: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8660: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8670: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8680: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
86a0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
86b0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
86c0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
86d0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
86e0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
86f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8700: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
8710: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
8720: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8730: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
8740: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
8750: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8760: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8770: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8780: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8790: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
87a0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
87b0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
87c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
87d0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
87e0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
87f0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8800: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8810: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
8820: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
8830: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
8840: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
8850: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8860: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8870: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8880: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8890: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
88a0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
88b0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
88c0: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
88d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
88e0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
88f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8900: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8910: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8920: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
8930: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
8940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
8950: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
8960: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8970: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8980: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8990: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
89a0: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
89b0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
89c0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
89d0: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
89e0: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
89f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8a00: 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20  PGNO(iPtrmap);. 
8a10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8a20: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
8a30: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
8a40: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8a50: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
8a60: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
8a70: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
8a80: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
8a90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
8aa0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
8ab0: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
8ac0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8ad0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8ae0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8af0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8b00: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8b10: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8b20: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8b30: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8b40: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8b50: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8b60: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8b70: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8b80: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8b90: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8ba0: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8bb0: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8bc0: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8bd0: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8be0: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8c00: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8c10: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8c20: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8c30: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8c40: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8c50: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8c60: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8c70: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8c80: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8c90: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8ca0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
8cb0: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
8cc0: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
8cd0: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
8ce0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8cf0: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
8d00: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
8d10: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
8d20: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
8d30: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
8d40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8d50: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
8d60: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
8d70: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
8d80: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
8d90: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
8da0: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
8db0: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
8dc0: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
8dd0: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
8de0: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
8df0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
8e00: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
8e10: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8e20: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
8e30: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
8e40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
8e50: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8e60: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8e70: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8ea0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8eb0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8ec0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8ed0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8ee0: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
8ef0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
8f00: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
8f10: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
8f20: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
8f30: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
8f40: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
8f50: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
8f60: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
8f70: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
8f80: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8f90: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
8fa0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
8fb0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
8fc0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
8fd0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
8fe0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
8ff0: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9000: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9010: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9020: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9030: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
9040: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
9050: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
9060: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
9070: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
9080: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9090: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
90a0: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
90b0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
90c0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
90d0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
90e0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
90f0: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9100: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9110: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9120: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9130: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
9140: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
9150: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
9160: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
9170: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9180: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
9190: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
91a0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
91b0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
91c0: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
91d0: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
91e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
91f0: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9200: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9210: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9220: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9230: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
9240: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
9250: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9260: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9270: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
9280: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
9290: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
92a0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
92b0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
92c0: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
92d0: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
92e0: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
92f0: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9300: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9310: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9320: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9330: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
9340: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
9350: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
9360: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
9370: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
9380: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
9390: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
93a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
93b0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
93c0: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
93d0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
93e0: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
93f0: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9400: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9410: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9420: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9430: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
9440: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
9450: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
9460: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
9470: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
9480: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
9490: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
94a0: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
94b0: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
94c0: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
94d0: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
94e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
94f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9500: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9510: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9520: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9530: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9540: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9560: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9570: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9580: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9590: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
95a0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
95b0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
95c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
95d0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
95e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
95f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9600: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9610: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9620: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9630: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9640: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9650: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
9660: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
9670: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
9680: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
9690: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
96a0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
96b0: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
96d0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
96e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
96f0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9700: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9710: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9730: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9740: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9750: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9760: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9770: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9780: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9790: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
97a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
97b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
97c0: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
97d0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
97e0: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
97f0: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9800: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9810: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9820: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9830: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9840: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9850: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9860: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9870: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9880: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9890: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
98a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
98b0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
98c0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
98d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
98e0: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
98f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9900: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9910: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9920: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9930: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9940: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9950: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9960: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9970: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9980: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9990: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
99a0: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
99b0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
99c0: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
99d0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
99e0: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
99f0: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9a00: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9a10: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9a20: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9a30: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9a40: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9a50: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9a60: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9a70: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9a80: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9a90: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9aa0: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9ab0: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9ac0: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9ad0: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9ae0: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9af0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9b00: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9b10: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9b20: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9b30: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9b40: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9b50: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9b60: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9b70: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9b80: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9b90: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9ba0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9bb0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9bc0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9bd0: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9be0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9bf0: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9c10: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9c20: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9c50: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9c60: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9c70: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9c80: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9c90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9ca0: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9cb0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9cc0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9cd0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9ce0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9cf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9d00: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9d10: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9d20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9d30: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
9d40: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
9d50: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
9d60: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
9d70: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9d80: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
9d90: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9da0: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9db0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9dc0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9dd0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9de0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9df0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9e00: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9e10: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9e20: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
9e30: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
9e40: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
9e50: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
9e60: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
9e70: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
9e80: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
9e90: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
9ea0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9eb0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9ec0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9ed0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9ef0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9f00: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9f10: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9f20: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9f30: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9f40: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f60: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9f70: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9f80: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9fa0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
9fb0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
9fc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9fd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9fe0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9ff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a000: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a010: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a020: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a030: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a040: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a050: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a060: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a070: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a080: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a090: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a0a0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a0b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a0c0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a0d0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a0e0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a0f0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a100: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a110: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a120: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a130: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a140: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a150: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a160: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a170: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a180: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a190: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a1a0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a1b0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a1c0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a1d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a1e0: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a1f0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a200: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a210: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a220: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a230: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a240: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a250: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a260: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a270: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a280: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a290: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a2a0: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a2b0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a2c0: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a2d0: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a2e0: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a2f0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a300: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a310: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a320: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a330: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a340: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a350: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a360: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a370: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a380: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a390: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a3a0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a3b0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a3c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a3d0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a3e0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a3f0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a400: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a410: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a420: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a430: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a440: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a450: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a470: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a480: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a490: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a4a0: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a4b0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a4c0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a4d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a4e0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a4f0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a500: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a510: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a520: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a530: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a540: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a550: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a560: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a570: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a580: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a590: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a5a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a5b0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a5c0: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a5d0: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a5e0: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a5f0: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a600: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a610: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a620: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a630: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a640: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a650: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a660: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a670: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a680: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a690: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
a6a0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
a6b0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6e0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a6f0: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
a700: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
a730: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
a740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a750: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
a760: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a770: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
a780: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
a790: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
a7a0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
a7b0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
a7c0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
a7d0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
a7e0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
a7f0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
a800: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
a810: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
a820: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
a830: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
a840: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
a850: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
a860: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
a870: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
a880: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a890: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
a8a0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
a8b0: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
a8c0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
a8d0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
a8e0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a8f0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
a900: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a910: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
a920: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
a930: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
a940: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
a950: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a960: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
a970: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
a980: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
a990: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
a9a0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
a9b0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
a9c0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
a9d0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
a9e0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
a9f0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
aa00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
aa10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
aa20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
aa30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
aa40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
aa50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
aa60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
aa70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
aa80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
aa90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
aaa0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
aab0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
aac0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
aad0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
aae0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
aaf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ab00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ab10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ab20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ab30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
ab40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
ab50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
ab60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
ab70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
ab80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
ab90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
aba0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
abb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
abc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
abd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
abe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
abf0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
ac00: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
ac10: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
ac20: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
ac30: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
ac40: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
ac50: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
ac60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
ac70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
ac80: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
ac90: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
aca0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
acb0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
acc0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
acd0: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
ace0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
acf0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
ad00: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
ad10: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
ad20: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
ad30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
ad40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ad50: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
ad60: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
ad70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ad80: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
ad90: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
ada0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
adb0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
adc0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
add0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
ade0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
adf0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
ae00: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
ae10: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
ae20: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
ae30: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
ae40: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
ae50: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
ae60: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
ae70: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
ae80: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
ae90: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
aea0: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
aeb0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
aec0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
aed0: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
aee0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
aef0: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
af00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
af10: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
af20: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
af30: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
af40: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
af50: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
af60: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
af70: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
af80: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
af90: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
afa0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
afb0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
afc0: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
afd0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
afe0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
aff0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b000: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b010: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b020: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b030: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b040: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b050: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b060: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b070: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b080: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b090: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b0a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b0b0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b0c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
b0d0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
b0e0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
b0f0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
b100: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
b110: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
b120: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
b130: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
b140: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
b150: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
b160: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
b170: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
b180: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
b190: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
b1a0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
b1b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
b1c0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
b1d0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
b1e0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
b1f0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
b200: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c  );.  if( info.nL
b210: 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
b220: 61 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ad ){.    Pgno o
b230: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
b240: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell[info.nSize
b250: 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  -4]);.    ptrmap
b260: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
b270: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
b280: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
b290: 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d  gno, pRC);.  }.}
b2a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
b2b0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
b2c0: 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20  age given. This 
b2d0: 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69  routine reorgani
b2e0: 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  zes cells within
b2f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20   the.** page so 
b300: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
b310: 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e  o free-blocks on
b320: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
b330: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  list..**.** Para
b340: 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69  meter nMaxFrag i
b350: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
b360: 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74  ount of fragment
b370: 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d 61  ed space that ma
b380: 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20  y be.** present 
b390: 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74 65  in the page afte
b3a0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
b3b0: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56  eturns..**.** EV
b3c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
b3d0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
b3e0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
b3f0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
b400: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
b410: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
b420: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
b430: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
b440: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
b450: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
b460: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
b470: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
b480: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
b490: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
b4a0: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
b4b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
b4c0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
b4d0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
b4e0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b4f0: 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a   int nMaxFrag){.
b500: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b520: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b530: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b550: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
b560: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
b570: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
b580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
b590: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
b5a0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
b5b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b5c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b5d0: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
b5e0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b5f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b600: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
b610: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
b620: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
b630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b640: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
b650: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
b660: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
b690: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b6a0: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
b6b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b6c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b6d0: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
b6e0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
b6f0: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
b700: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
b710: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
b720: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
b730: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
b740: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
b750: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b760: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
b770: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
b780: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
b790: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
b7a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
b7b0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
b7c0: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
b7d0: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
b7e0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
b7f0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
b800: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
b810: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b820: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b830: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b840: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b850: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b860: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b870: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
b880: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
b890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b8a0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
b8b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b8c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b8d0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b8e0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
b8f0: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
b900: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
b910: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b920: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
b930: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
b940: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
b950: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
b960: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
b970: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
b980: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43  [hdr+3]) );.  iC
b990: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
b9a0: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b  ffset + 2*nCell;
b9b0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
b9c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b9d0: 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68  leSize;..  /* Th
b9e0: 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
b9f0: 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20   pages with two 
ba00: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c  or fewer free bl
ba10: 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61  ocks and nMaxFra
ba20: 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20  g.  ** or fewer 
ba30: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
ba40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
ba50: 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d  t is faster to m
ba60: 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  ove the.  ** two
ba70: 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73   (or one) blocks
ba80: 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20   of cells using 
ba90: 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64  memmove() and ad
baa0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20  d the required. 
bab0: 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65   ** offsets to e
bac0: 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ach pointer in t
bad0: 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
bae0: 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73  array than it is
baf0: 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73   to .  ** recons
bb00: 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65  truct the entire
bb10: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28   page.  */.  if(
bb20: 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37   (int)data[hdr+7
bb30: 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20  ]<=nMaxFrag ){. 
bb40: 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67     int iFree = g
bb50: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
bb60: 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  r+1]);.    if( i
bb70: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Free ){.      in
bb80: 74 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62  t iFree2 = get2b
bb90: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d  yte(&data[iFree]
bba0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67  );..      /* pag
bbb0: 65 46 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20  eFindSlot() has 
bbc0: 61 6c 72 65 61 64 79 20 76 65 72 69 66 69 65 64  already verified
bbd0: 20 74 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b   that free block
bbe0: 73 20 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20  s are sorted.   
bbf0: 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f     ** in order o
bc00: 66 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  f offset within 
bc10: 74 68 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68  the page, and th
bc20: 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65  at no block exte
bc30: 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73  nds.      ** pas
bc40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
bc50: 20 70 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20   page. Provided 
bc60: 74 68 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f  the two free slo
bc70: 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20  ts do not .     
bc80: 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69   ** overlap, thi
bc90: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
bca0: 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20  t the memmove() 
bcb0: 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c  calls below will
bcc0: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76   not.      ** ov
bcd0: 65 72 77 72 69 74 65 20 74 68 65 20 75 73 61 62  erwrite the usab
bce0: 6c 65 53 69 7a 65 20 62 79 74 65 20 62 75 66 66  leSize byte buff
bcf0: 65 72 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  er, even if the 
bd00: 64 61 74 61 62 61 73 65 20 70 61 67 65 0a 20 20  database page.  
bd10: 20 20 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70      ** is corrup
bd20: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  t.  */.      ass
bd30: 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c  ert( iFree2==0 |
bd40: 7c 20 69 46 72 65 65 32 3e 69 46 72 65 65 20 29  | iFree2>iFree )
bd50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bd60: 69 46 72 65 65 2b 67 65 74 32 62 79 74 65 28 26  iFree+get2byte(&
bd70: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c  data[iFree+2]) <
bd80: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
bd90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
bda0: 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65  ree2==0 || iFree
bdb0: 32 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2+get2byte(&data
bdc0: 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75  [iFree2+2]) <= u
bdd0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20  sableSize );..  
bde0: 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65      if( 0==iFree
bdf0: 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65  2 || (data[iFree
be00: 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46  2]==0 && data[iF
be10: 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20  ree2+1]==0) ){. 
be20: 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20         u8 *pEnd 
be30: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
be40: 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
be50: 20 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72         u8 *pAddr
be60: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
be70: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
be80: 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
be90: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29  (&data[iFree+2])
bea0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  ;.        int to
beb0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
bec0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
bed0: 20 20 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72      if( top>=iFr
bee0: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
bef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bf00: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
bf10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
bf20: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20       if( iFree2 
bf30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
bf40: 65 72 74 28 20 69 46 72 65 65 2b 73 7a 3c 3d 69  ert( iFree+sz<=i
bf50: 46 72 65 65 32 20 29 3b 20 2f 2a 20 56 65 72 69  Free2 ); /* Veri
bf60: 66 69 65 64 20 62 79 20 70 61 67 65 46 69 6e 64  fied by pageFind
bf70: 53 6c 6f 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  Slot() */.      
bf80: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
bf90: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
bfa0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  2]);.          a
bfb0: 73 73 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b  ssert( iFree+sz+
bfc0: 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65  sz2+iFree2-(iFre
bfd0: 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+sz) <= usableS
bfe0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
bff0: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
c000: 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64  Free+sz+sz2], &d
c010: 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69  ata[iFree+sz], i
c020: 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29  Free2-(iFree+sz)
c030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
c040: 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20  += sz2;.        
c050: 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d  }.        cbrk =
c060: 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20   top+sz;.       
c070: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69   assert( cbrk+(i
c080: 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61  Free-top) <= usa
c090: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
c0a0: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
c0b0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f  [cbrk], &data[to
c0c0: 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a  p], iFree-top);.
c0d0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64          for(pAdd
c0e0: 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  r=&data[cellOffs
c0f0: 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b  et]; pAddr<pEnd;
c100: 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20   pAddr+=2){.    
c110: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
c120: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
c130: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72        if( pc<iFr
c140: 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  ee ){ put2byte(p
c150: 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a  Addr, pc+sz); }.
c160: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
c170: 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20  f( pc<iFree2 ){ 
c180: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
c190: 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20  pc+sz2); }.     
c1a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
c1b0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  o defragment_out
c1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c1d0: 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73    }..  cbrk = us
c1e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
c1f0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c200: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
c210: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
c220: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
c230: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
c240: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
c250: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
c260: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
c270: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
c280: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
c290: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c2a0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
c2b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c2c0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
c2d0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
c2e0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
c2f0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
c300: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
c310: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
c320: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
c330: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
c340: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
c350: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c360: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c380: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c390: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
c3a0: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
c3b0: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
c3c0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
c3d0: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
c3e0: 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b  ize(pPage, &src[
c3f0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
c400: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
c410: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
c420: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c430: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c450: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
c470: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
c480: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
c490: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
c4a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
c4b0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
c4c0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
c4d0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c4f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c500: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
c510: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
c520: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
c530: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
c540: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
c550: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
c560: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
c570: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
c580: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
c590: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
c5a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
c5b0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
c5c0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
c5d0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
c5e0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
c5f0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
c600: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
c610: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
c620: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
c630: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
c640: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
c650: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
c660: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
c670: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c680: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c690: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
c6a0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
c6b0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
c6c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c6d0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
c6e0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
c6f0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
c700: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
c710: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
c720: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
c730: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c740: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c750: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c760: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
c770: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c780: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
c790: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
c7a0: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
c7b0: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
c7c0: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
c7d0: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
c7e0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
c7f0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
c800: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
c810: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
c820: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
c830: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
c840: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
c850: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
c860: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
c870: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
c880: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
c890: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
c8a0: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
c8b0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
c8c0: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
c8d0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
c8e0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
c8f0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
c900: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
c910: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
c920: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
c930: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
c940: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
c950: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
c960: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
c970: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
c980: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
c990: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
c9a0: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
c9b0: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
c9c0: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
c9d0: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
c9e0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
c9f0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
ca00: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
ca10: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
ca20: 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20  rOffset;.  u8 * 
ca30: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
ca40: 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  g->aData;.  int 
ca50: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
ca60: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
ca70: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
ca80: 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  r]);.  int x;.  
ca90: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
caa0: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
cab0: 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 73 69 7a  eSize;.  int siz
cac0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
cad0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
cae0: 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73  e slot */..  ass
caf0: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 77  ert( pc>0 );.  w
cb00: 68 69 6c 65 28 20 70 63 3c 3d 75 73 61 62 6c 65  hile( pc<=usable
cb10: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a  Size-4 ){.    /*
cb20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cb30: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
cb40: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
cb50: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
cb60: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
cb70: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
cb80: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
cb90: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
cba0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
cbb0: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
cbc0: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
cbd0: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
cbe0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
cbf0: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
cc00: 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69  .    if( (x = si
cc10: 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29  ze - nByte)>=0 )
cc20: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
cc30: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
cc40: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
cc50: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
cc60: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
cc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
cc80: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
cc90: 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20  T_PAGE(pPg);.   
cca0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ccb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
ccc0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <4 ){.        /*
ccd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cce0: 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61  11498-58022 In a
ccf0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
cd00: 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f  ree page, the to
cd10: 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  tal.        ** n
cd20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
cd30: 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20  n fragments may 
cd40: 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a  not exceed 60. *
cd50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  /.        if( aD
cd60: 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20  ata[hdr+7]>57 ) 
cd70: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20  return 0;..     
cd80: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
cd90: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
cda0: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
cdb0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
cdc0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
cdd0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
cde0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
cdf0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
ce00: 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44  Data[iAddr], &aD
ce10: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
ce20: 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37       aData[hdr+7
ce30: 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20  ] += (u8)x;.    
ce40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ce50: 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d   /* The slot rem
ce60: 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ains on the free
ce70: 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74  -list. Reduce it
ce80: 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e  s size to accoun
ce90: 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  t.         ** fo
cea0: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
ceb0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
cec0: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
ced0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61       put2byte(&a
cee0: 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  Data[pc+2], x);.
cef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
cf00: 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b  turn &aData[pc +
cf10: 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   x];.    }.    i
cf20: 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70  Addr = pc;.    p
cf30: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
cf40: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66  ata[pc]);.    if
cf50: 28 20 70 63 3c 69 41 64 64 72 2b 73 69 7a 65 20  ( pc<iAddr+size 
cf60: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
cf70: 66 28 20 70 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( pc ){.    *pR
cf80: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
cf90: 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20  PT_PAGE(pPg);.  
cfa0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
cfb0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
cfc0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
cfd0: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
cfe0: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
cff0: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
d000: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d010: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
d020: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
d030: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
d040: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
d050: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
d060: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
d070: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
d080: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
d090: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
d0a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
d0b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
d0c0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
d0d0: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
d0e0: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
d0f0: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
d100: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
d110: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
d120: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
d130: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
d140: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
d150: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
d160: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
d170: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
d180: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
d190: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
d1a0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d1b0: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
d1c0: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
d1d0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
d1e0: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
d1f0: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
d200: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
d210: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
d220: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
d230: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
d240: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
d250: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
d260: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
d270: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
d280: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
d290: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d2a0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
d2b0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
d2c0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
d2d0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
d2e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
d2f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d300: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
d310: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d340: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
d350: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d360: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d370: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
d390: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
d3a0: 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20  */.  int gap;   
d3b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d3c0: 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65  te of gap betwee
d3d0: 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  n cell pointers 
d3e0: 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  and cell content
d3f0: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
d400: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
d410: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
d420: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d430: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
d440: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d450: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d460: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d470: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d480: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
d490: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
d4a0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
d4b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
d4c0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
d4d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
d4e0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
d4f0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28  ssert( nByte < (
d500: 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d  int)(pPage->pBt-
d510: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29  >usableSize-8) )
d520: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
d530: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
d540: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
d550: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
d560: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
d570: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
d580: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
d590: 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29  rt( gap<=65536 )
d5a0: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
d5b0: 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39  OF: R-29356-0239
d5c0: 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  1 If the databas
d5d0: 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62  e uses a 65536-b
d5e0: 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20  yte page size.  
d5f0: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72  ** and the reser
d600: 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72  ved space is zer
d610: 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c  o (the usual val
d620: 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20  ue for reserved 
d630: 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e  space).  ** then
d640: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d650: 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65  t offset of an e
d660: 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20  mpty page wants 
d670: 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a  to be 65536..  *
d680: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
d690: 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c  integer is too l
d6a0: 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65  arge to be store
d6b0: 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e  d in a 2-byte un
d6c0: 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65  signed.  ** inte
d6d0: 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20  ger, so a value 
d6e0: 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20  of 0 is used in 
d6f0: 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20  its place. */.  
d700: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
d710: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
d720: 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e  assert( top<=(in
d730: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
d740: 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50  ableSize ); /* P
d750: 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64  revent by getAnd
d760: 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20  InitPage() */.  
d770: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
d780: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26     if( top==0 &&
d790: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d7a0: 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29  bleSize==65536 )
d7b0: 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35  {.      top = 65
d7c0: 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  536;.    }else{.
d7d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d7e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
d7f0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
d800: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
d810: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
d820: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
d830: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
d840: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
d850: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
d860: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
d870: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
d880: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
d890: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
d8a0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
d8b0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
d8c0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
d8d0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
d8e0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
d8f0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
d900: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d910: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
d920: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
d930: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
d940: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
d950: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
d960: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
d970: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
d980: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
d990: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
d9a0: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
d9b0: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
d9c0: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
d9d0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
d9e0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
d9f0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
da00: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
da10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
da20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
da30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
da40: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
da50: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
da60: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
da70: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
da80: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
da90: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
daa0: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
dab0: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
dac0: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
dad0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
dae0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
daf0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
db00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
db10: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
db20: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
db30: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
db40: 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28  Page(pPage, MIN(
db50: 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  4, pPage->nFree 
db60: 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20  - (2+nByte)));. 
db70: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
db80: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
db90: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
dba0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
dbb0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
dbc0: 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  2+nByte<=top );.
dbd0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
dbe0: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
dbf0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
dc00: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
dc10: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
dc20: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
dc30: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
dc40: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
dc50: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
dc60: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
dc70: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
dc80: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
dc90: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
dca0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
dcb0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
dcc0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
dcd0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
dce0: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
dcf0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
dd00: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
dd10: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
dd20: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
dd30: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
dd40: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
dd50: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
dd60: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
dd70: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dd80: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
dd90: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
dda0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ddb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ddc0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
ddd0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
dde0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
ddf0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
de00: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
de10: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
de20: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
de30: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
de40: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
de50: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
de60: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
de70: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
de80: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  esced..**.** Not
de90: 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
dea0: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
deb0: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
dec0: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
ded0: 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ge(),.** that ro
dee0: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
def0: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
df00: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
df10: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
df20: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
df30: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
df40: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
df50: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
df60: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
df70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
df80: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
df90: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
dfa0: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
dfb0: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
dfc0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
dfd0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
dfe0: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
dff0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
e000: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
e010: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
e020: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
e030: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
e040: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e060: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
e070: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
e080: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
e090: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0b0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
e0c0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
e0d0: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
e100: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
e110: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
e120: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
e150: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
e160: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
e170: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e190: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
e1a0: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36  f iSize */.  u16
e1b0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
e1e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e1f0: 61 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  a */.  u32 iEnd 
e200: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
e210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e220: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
e230: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
e240: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
e250: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
e260: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
e270: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
e280: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e290: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
e2a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e2b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
e2c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e2d0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e2e0: 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e  PT_DB || iStart>
e2f0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
e300: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
e310: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
e320: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
e330: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
e340: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e350: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
e360: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e370: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e380: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e390: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
e3a0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
e3b0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
e3c0: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
e3d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e3e0: 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a  eSize-4 );..  /*
e3f0: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
e400: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
e410: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
e420: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
e430: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
e440: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
e450: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
e460: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
e470: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
e480: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
e490: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
e4a0: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
e4b0: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
e4c0: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
e4d0: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
e4e0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
e4f0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
e500: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
e510: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
e520: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
e530: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
e540: 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  )<iStart ){.    
e550: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
e560: 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  Ptr+4 ){.       
e570: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30   if( iFreeBlk==0
e580: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5a0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
e5b0: 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
e5c0: 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42     iPtr = iFreeB
e5d0: 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  lk;.    }.    if
e5e0: 28 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65  ( iFreeBlk>pPage
e5f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e600: 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  e-4 ){.      ret
e610: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e620: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e630: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
e640: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
e650: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
e660: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
e670: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
e680: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
e690: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
e6a0: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
e6b0: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
e6c0: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
e6d0: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
e6e0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
e6f0: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
e700: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
e710: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
e720: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
e730: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
e740: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
e750: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
e760: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
e770: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
e780: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
e790: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
e7a0: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
e7b0: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
e7c0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e7d0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45  pPage);.      iE
e7e0: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
e7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e800: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
e810: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
e820: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e830: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
e840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e850: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
e860: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e870: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
e880: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
e890: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
e8a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
e8b0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
e8c0: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
e8d0: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
e8e0: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
e8f0: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
e900: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
e910: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
e920: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
e930: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
e940: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
e950: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
e960: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e970: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
e980: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
e990: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
e9a0: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
e9b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
e9c0: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
e9d0: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
e9e0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
e9f0: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
ea00: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
ea10: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
ea20: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Page);.        n
ea30: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
ea40: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
ea50: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
ea60: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
ea70: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
ea80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ea90: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
eaa0: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
eab0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
eac0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64  GE(pPage);.    d
ead0: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
eae0: 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67  rag;.  }.  x = g
eaf0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
eb00: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74  r+5]);.  if( iSt
eb10: 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a  art<=x ){.    /*
eb20: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
eb30: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
eb40: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
eb50: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
eb60: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
eb70: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
eb80: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
eb90: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
eba0: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
ebb0: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
ebc0: 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c  .    if( iStart<
ebd0: 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31  x || iPtr!=hdr+1
ebe0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ebf0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ec00: 61 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  age);.    put2by
ec10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  te(&data[hdr+1],
ec20: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
ec30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ec40: 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20  dr+5], iEnd);.  
ec50: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
ec60: 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65  sert the new fre
ec70: 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20  eblock into the 
ec80: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20  freelist */.    
ec90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
eca0: 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20  Ptr], iStart);. 
ecb0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
ecc0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
ecd0: 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20  BTS_FAST_SECURE 
ece0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
ecf0: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
ed00: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
ed10: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
ed20: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
ed30: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
ed40: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
ed50: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
ed60: 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  0, iSize);.  }. 
ed70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ed80: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
ed90: 6b 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  k);.  put2byte(&
eda0: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
edb0: 69 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  iSize);.  pPage-
edc0: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
edd0: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
ede0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
edf0: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
ee00: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
ee10: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
ee20: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
ee30: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
ee40: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
ee50: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
ee60: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
ee70: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
ee80: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
ee90: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
eea0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
eeb0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
eec0: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
eed0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
eee0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
eef0: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
ef00: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
ef10: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
ef20: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
ef30: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
ef40: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
ef50: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ef60: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
ef70: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
ef80: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
ef90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
efa0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
efb0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
efc0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
efd0: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
efe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
eff0: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
f000: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
f010: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
f020: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f030: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f040: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
f050: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
f060: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
f070: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
f080: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
f090: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
f0a0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
f0b0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
f0c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
f0d0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
f0e0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
f0f0: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
f100: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
f110: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
f120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
f130: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f140: 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35  E-OF: R-07291-35
f150: 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35  328 A value of 5
f160: 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68   (0x05) means th
f170: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
f180: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62   ** interior tab
f190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
f1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
f1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
f1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f1e0: 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36  F: R-26900-09176
f1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28   A value of 13 (
f200: 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0d) means the 
f210: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
f220: 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72   leaf table b-tr
f230: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f240: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
f250: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
f260: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29  |PTF_LEAF)==13 )
f270: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f280: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Key = 1;.    if(
f290: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
f2a0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f2b0: 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20  KeyLeaf = 1;.   
f2c0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f2d0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f2e0: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
f2f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
f300: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f310: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
f320: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
f330: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
f340: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
f350: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
f360: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
f370: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
f380: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f390: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
f3a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
f3b0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
f3c0: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
f3d0: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
f3e0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
f3f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f400: 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76  -43316-37308 A v
f410: 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29  alue of 2 (0x02)
f420: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
f430: 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
f440: 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  erior index b-tr
f450: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f460: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
f470: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
f480: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f490: 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41   R-59615-42828 A
f4a0: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78   value of 10 (0x
f4b0: 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0a) means the pa
f4c0: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
f4d0: 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65  eaf index b-tree
f4e0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f4f0: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
f500: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
f510: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
f520: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
f530: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
f540: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
f550: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f560: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f570: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
f580: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
f590: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
f5a0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
f5b0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
f5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f5d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f5e0: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
f5f0: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
f600: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
f610: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
f620: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
f630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f640: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
f650: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
f660: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
f670: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
f680: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
f690: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f6a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
f6b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
f6c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
f6d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
f6e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
f6f0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
f700: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
f710: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
f720: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
f730: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
f740: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
f750: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
f760: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
f770: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
f780: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
f790: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
f7a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
f7b0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
f7c0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
f7d0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
f7e0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
f7f0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
f800: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
f810: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
f820: 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  age){.  int pc; 
f830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f840: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
f850: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
f860: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
f870: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
f880: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
f890: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
f8a0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
f8b0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
f8c0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
f8d0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
f8e0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f8f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
f900: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
f910: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
f920: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
f930: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
f940: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
f950: 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  */.  u16 cellOff
f960: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
f970: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
f980: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
f990: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
f9a0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
f9b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f9c0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
f9d0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
f9e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
f9f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
fa00: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
fa10: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
fa20: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
fa30: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
fa40: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
fa50: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
fa60: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
fa70: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
fa80: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
fa90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
faa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
fab0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
fac0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fad0: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
fae0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
faf0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
fb00: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fb10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fb20: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
fb30: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
fb40: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
fb50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
fb60: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
fb70: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
fb80: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fb90: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
fba0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
fbb0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
fbc0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
fbd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
fbe0: 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nit==0 );..  pBt
fbf0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
fc00: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
fc10: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
fc20: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fc30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
fc40: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
fc50: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
fc60: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
fc70: 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  dicating.  ** th
fc80: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
fc90: 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63  pe. */.  if( dec
fca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
fcb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20  data[hdr]) ){.  
fcc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fcd0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
fce0: 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
fcf0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
fd00: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
fd10: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
fd20: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
fd30: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
fd40: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
fd50: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
fd60: 77 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  w = 0;.  usableS
fd70: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
fd80: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
fd90: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
fda0: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
fdb0: 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  8 + pPage->child
fdc0: 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  PtrSize;.  pPage
fdd0: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
fde0: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
fdf0: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
fe00: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
fe10: 66 73 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  fset];.  pPage->
fe20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
fe30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
fe40: 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49  rSize];.  /* EVI
fe50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
fe60: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
fe70: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
fe80: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
fe90: 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  tes.  ** the sta
fea0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  rt of the cell c
feb0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a  ontent area. A z
fec0: 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ero value for th
fed0: 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20  is integer is.  
fee0: 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ** interpreted a
fef0: 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f  s 65536. */.  to
ff00: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ff10: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ff20: 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
ff30: 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37  -OF: R-37002-327
ff40: 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  74 The two-byte 
ff50: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
ff60: 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 3 gives the.  
ff70: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  ** number of cel
ff80: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ls on the page. 
ff90: 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  */.  pPage->nCel
ffa0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
ffb0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66  ta[hdr+3]);.  if
ffc0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
ffd0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
ffe0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
fff0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
10000 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
10010 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
10020 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
10030 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10040 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
10050 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
10060 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
10070 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56  (pBt) );.  /* EV
10080 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
10090 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61  89-57979 If a pa
100a0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
100b0 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f  ells (which is o
100c0 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c  nly.  ** possibl
100d0 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
100e0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
100f0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
10100 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ws) then the.  *
10110 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * offset to the 
10120 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
10130 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65  a will equal the
10140 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73   page size minus
10150 20 74 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20   the.  ** bytes 
10160 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
10170 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
10180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
10190 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
101a0 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
101b0 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  );..  /* A malfo
101c0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
101d0 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
101e0 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
101f0 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70  he end.  ** of p
10200 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  age when parsing
10210 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a   a cell.  .  **.
10220 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
10230 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
10240 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
10250 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
10260 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74  xtends.  ** past
10270 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
10280 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
10290 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
102a0 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 2a  RRUPT to be .  *
102b0 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  * returned if it
102c0 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43   does..  */.  iC
102d0 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
102e0 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
102f0 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  >nCell;.  iCellL
10300 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
10310 20 2d 20 34 3b 0a 20 20 69 66 28 20 70 42 74 2d   - 4;.  if( pBt-
10320 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
10330 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29  ITE_CellSizeCk )
10340 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
10350 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10360 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
10370 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
10380 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
10390 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
103a0 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
103b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
103c0 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
103d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
103e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
103f0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 67 65  ){.      pc = ge
10400 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
10410 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
10420 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  *2]);.      test
10430 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
10440 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65  irst );.      te
10450 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
10460 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 69  lLast );.      i
10470 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10480 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
10490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
104a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
104b0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
104c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20       }.      sz 
104d0 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
104e0 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
104f0 70 63 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  pc]);.      test
10500 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
10510 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
10520 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
10530 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10550 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10560 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10570 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
10580 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10590 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  st++;.  }  ..  /
105a0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
105b0 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
105c0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
105d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
105e0 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
105f0 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10600 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
10610 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74  s the.  ** start
10620 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72   of the first fr
10630 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  eeblock on the p
10640 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20  age, or is zero 
10650 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
10660 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
10670 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62   */.  pc = get2b
10680 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
10690 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74  );.  nFree = dat
106a0 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20  a[hdr+7] + top; 
106b0 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74   /* Init nFree t
106c0 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20  o non-freeblock 
106d0 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  free space */.  
106e0 69 66 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  if( pc>0 ){.    
106f0 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u32 next, size;.
10700 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
10710 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f  First ){.      /
10720 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10730 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
10740 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
10750 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
10760 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61   will.      ** a
10770 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61 73  lways be at leas
10780 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72  t one cell befor
10790 65 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  e the first free
107a0 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  block..      */.
107b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
107c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
107d0 28 70 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a  (pPage); .    }.
107e0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
107f0 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65        if( pc>iCe
10800 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10810 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f    /* Freeblock o
10820 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
10830 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
10840 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10850 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10860 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
10870 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
10880 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
10890 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
108a0 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
108b0 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d  );.      nFree =
108c0 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
108d0 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70       if( next<=p
108e0 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b  c+size+3 ) break
108f0 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
10900 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
10910 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20   next>0 ){.     
10920 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f   /* Freeblock no
10930 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
10940 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rder */.      re
10950 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10960 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10980 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64  c+size>(unsigned
10990 20 69 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20   int)usableSize 
109a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74  ){.      /* Last
109b0 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e   freeblock exten
109c0 64 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64  ds past page end
109d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
109e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
109f0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10a00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20   }.  }..  /* At 
10a10 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
10a20 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
10a30 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
10a40 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
10a50 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
10a60 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
10a70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
10a80 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
10a90 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63  .  ** the cell-c
10aa0 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
10ab0 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
10ac0 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
10ad0 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
10ae0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
10af0 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
10b00 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
10b10 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72  ck also.  ** ser
10b20 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
10b30 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
10b40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10b50 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
10b60 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
10b70 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
10b80 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
10b90 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
10ba0 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75  */.  if( nFree>u
10bb0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
10bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10bd0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10be0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
10bf0 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
10c00 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
10c10 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  t);.  pPage->isI
10c20 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  nit = 1;.  retur
10c30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10c40 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
10c50 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
10c60 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
10c70 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
10c80 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
10c90 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
10ca0 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
10cb0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
10cc0 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
10cd0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
10ce0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10cf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10d00 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
10d10 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
10d20 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
10d30 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
10d40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
10d50 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
10d60 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
10d70 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
10d80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
10d90 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10da0 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
10db0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
10dc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
10dd0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
10de0 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
10df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10e00 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
10e10 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
10e20 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10e30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10e40 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10e50 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
10e60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
10e70 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
10e80 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
10e90 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
10ea0 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
10eb0 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
10ec0 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
10ed0 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
10ee0 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
10ef0 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
10f00 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10f10 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
10f20 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
10f30 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10f40 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
10f50 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
10f60 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10f70 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
10f80 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
10f90 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
10fa0 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
10fb0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
10fc0 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
10fd0 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
10fe0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
10ff0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
11000 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
11010 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
11020 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
11030 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11040 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
11050 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
11060 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
11070 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
11080 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
11090 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
110a0 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
110b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
110c0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
110d0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
110e0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
110f0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
11100 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
11110 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
11120 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
11130 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
11140 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
11150 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
11160 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11170 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
11180 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
11190 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
111a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
111b0 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
111c0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
111d0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
111e0 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
111f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
11200 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
11210 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11220 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
11230 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
11240 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
11250 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
11260 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
11270 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
11280 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
11290 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
112a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
112b0 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
112c0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
112d0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
112e0 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
112f0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11300 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
11310 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
11320 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
11330 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
11340 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
11350 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
11360 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
11370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
11380 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
11390 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
113a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
113b0 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
113c0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
113d0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
113e0 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
113f0 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
11400 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
11410 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
11420 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
11430 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
11440 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
11450 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
11460 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
11470 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
11480 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
11490 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
114a0 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
114b0 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
114c0 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
114d0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
114e0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
114f0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
11500 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
11510 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
11520 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
11530 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
11540 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
11550 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
11560 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
11570 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
11580 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
11590 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
115a0 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
115b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
115c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
115d0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
115e0 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
115f0 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
11600 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
11610 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
11620 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
11630 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
11640 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
11650 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
11660 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
11670 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11680 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11690 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
116a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
116b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
116c0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
116d0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
116e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
116f0 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
11700 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
11710 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
11720 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
11730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11740 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
11750 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
11760 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
11770 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
11780 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
11790 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
117a0 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
117b0 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
117c0 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
117d0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
117e0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
117f0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
11800 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
11810 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
11820 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
11830 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
11840 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
11850 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11860 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11870 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
11880 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
11890 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
118a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
118b0 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
118c0 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
118d0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
118e0 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
118f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11900 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11910 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11920 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
11930 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
11940 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
11950 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
11960 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
11970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
11980 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
11990 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
119a0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
119b0 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
119c0 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
119d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
119e0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
119f0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
11a00 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
11a10 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
11a20 30 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  0000000)==0 );. 
11a30 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
11a40 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
11a50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
11a60 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
11a70 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
11a80 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  e it..**.** If p
11a90 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Cur!=0 then the 
11aa0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65  page is being fe
11ab0 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66  tched as part of
11ac0 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
11ad0 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64  .** call.  Do ad
11ae0 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20  ditional sanity 
11af0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
11b00 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
11b10 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  e..** And if the
11b20 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68   fetch fails, th
11b30 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
11b40 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e  decrement pCur->
11b50 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iPage..**.** The
11b60 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64   page is fetched
11b70 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75   as read-write u
11b80 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f  nless pCur is no
11b90 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a  t NULL and is.**
11ba0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
11bb0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  sor..**.** If an
11bc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
11bd0 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75  hen *ppPage is u
11be0 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20  ndefined. It.** 
11bf0 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61  may remain uncha
11c00 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20  nged, or it may 
11c10 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76  be set to an inv
11c20 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  alid value..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
11c40 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
11c50 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
11c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11c80 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11cb0 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
11cc0 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
11cd0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
11ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11cf0 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
11d00 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75  r here */.  BtCu
11d10 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
11d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11d30 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65  ursor to receive
11d40 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55   the page, or NU
11d50 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  LL */.  int bRea
11d60 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  dOnly           
11d70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11d80 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
11d90 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
11da0 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
11db0 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
11dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11dd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
11df0 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d  ur==0 || ppPage=
11e00 3d 26 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  =&pCur->pPage );
11e10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
11e20 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d  =0 || bReadOnly=
11e30 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46  =pCur->curPagerF
11e40 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74  lags );.  assert
11e50 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75  ( pCur==0 || pCu
11e60 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20  r->iPage>0 );.. 
11e70 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
11e80 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
11e90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11ea0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11eb0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11ec0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11ed0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11ee0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
11ef0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
11f00 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
11f10 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66  bReadOnly);.  if
11f20 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ( rc ){.    goto
11f30 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
11f40 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70  error;.  }.  *pp
11f50 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
11f60 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
11f70 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
11f80 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
11f90 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
11fa0 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44    btreePageFromD
11fb0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
11fc0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72  gno, pBt);.    r
11fd0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
11fe0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
11ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12000 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
12010 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
12020 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41  .      goto getA
12030 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
12040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
12050 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
12060 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
12070 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
12080 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  e)->aData==sqlit
12090 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
120a0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
120b0 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
120c0 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
120d0 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
120e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
120f0 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
12100 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
12110 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
12120 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28    if( pCur && ((
12130 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
12140 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
12150 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
12160 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20  rIntKey) ){.    
12170 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12180 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a  UPT_PGNO(pgno);.
12190 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
121a0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f  *ppPage);.    go
121b0 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
121c0 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
121d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
121e0 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  ..getAndInitPage
121f0 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43  _error:.  if( pC
12200 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ur ){.    pCur->
12210 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75  iPage--;.    pCu
12220 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
12230 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
12240 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age];.  }.  test
12250 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
12260 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
12270 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
12280 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
12290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
122a0 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
122b0 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
122c0 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
122d0 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
122e0 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
122f0 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  GetPage..**.** P
12300 61 67 65 31 20 69 73 20 61 20 73 70 65 63 69 61  age1 is a specia
12310 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20  l case and must 
12320 62 65 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  be released usin
12330 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  g releasePageOne
12340 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
12350 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
12360 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
12370 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
12380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
12390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
123a0 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
123b0 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
123c0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
123d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
123e0 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
123f0 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
12400 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
12410 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
12420 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
12430 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
12440 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12450 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12460 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12470 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
12480 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
12490 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
124a0 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
124b0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
124c0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
124d0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
124e0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
124f0 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74  ull(pPage);.}.st
12500 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
12510 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
12520 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
12530 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
12540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12550 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
12560 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
12570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12580 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
12590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
125a0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
125b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
125c0 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
125d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
125e0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
125f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
12600 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
12610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12620 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12630 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
12640 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
12650 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
12660 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
12670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
12680 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
12690 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
126a0 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
126b0 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
126c0 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
126d0 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
126e0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
126f0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
12700 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
12710 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
12720 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
12730 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
12740 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
12750 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
12760 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
12770 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
12780 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
12790 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
127a0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
127b0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
127c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
127d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
127e0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
127f0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
12800 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
12810 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12820 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
12830 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
12840 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12850 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12860 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12870 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12880 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12890 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
128a0 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
128b0 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
128c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
128d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
128e0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
128f0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
12900 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
12910 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
12920 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
12930 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
12940 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12950 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12960 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12970 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12980 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12990 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
129a0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
129b0 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
129c0 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
129d0 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
129e0 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
129f0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
12a00 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
12a10 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
12a20 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
12a30 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
12a40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
12a50 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12a60 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12a70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a90 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12aa0 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12ab0 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
12ac0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
12ad0 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
12ae0 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
12af0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
12b00 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
12b10 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
12b20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
12b30 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
12b40 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
12b50 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12b60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12b70 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12b80 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12b90 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12ba0 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12bb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12bc0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12bd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12be0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12bf0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12c00 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12c10 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
12c20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
12c30 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
12c40 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12c50 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12c60 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12c70 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12c80 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12c90 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12ca0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12cb0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12cc0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12cd0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12ce0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12cf0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
12d00 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
12d10 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
12d20 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
12d30 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
12d40 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12d50 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12d60 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12d70 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12d80 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12d90 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12da0 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12db0 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12dc0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12dd0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12de0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
12df0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12e00 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
12e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12e20 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
12e30 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
12e40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12e50 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12e60 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12e70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12e80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12e90 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12ea0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12eb0 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12ec0 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12ed0 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12ee0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
12f10 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
12f20 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  r));.}../*.** Op
12f30 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
12f40 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
12f50 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
12f60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12f70 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
12f80 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
12f90 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
12fa0 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
12fb0 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
12fc0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
12fd0 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
12fe0 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
12ff0 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
13000 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
13010 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
13020 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
13030 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
13040 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
13050 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
13060 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
13070 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
13080 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
13090 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
130a0 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
130b0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
130c0 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
130d0 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
130e0 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
130f0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
13100 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
13110 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
13120 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
13130 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
13140 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
13150 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
13160 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
13170 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
13180 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13190 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
131a0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
131b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
131c0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
131d0 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
131e0 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
131f0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
13200 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
13210 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
13220 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
13230 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
13240 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
13250 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
13260 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13270 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
13280 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
13290 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
132a0 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
132b0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
132c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
132d0 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
132e0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
132f0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
13300 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
13310 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
13320 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
13330 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
13340 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
13350 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
13360 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
13370 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13380 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
13390 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
133a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
133b0 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
133c0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
133d0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
133e0 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
133f0 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
13400 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
13410 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
13420 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
13430 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
13440 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
13450 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
13460 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
13470 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
13480 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
13490 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
134a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
134b0 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
134c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
134d0 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
134e0 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
134f0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
13500 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
13510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
13530 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
13540 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
13550 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
13560 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
13570 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
13580 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
13590 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
135a0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
135b0 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
135c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
135d0 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
135e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
135f0 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
13600 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
13610 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
13620 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
13630 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
13640 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
13650 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
13660 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
13670 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
13680 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
13690 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
136a0 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
136b0 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
136c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
136d0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
136e0 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
136f0 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
13700 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
13710 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
13720 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
13730 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
13740 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
13750 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
13760 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
13770 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
13780 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
13790 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
137a0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
137b0 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
137c0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
137d0 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
137e0 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
137f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13800 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
13810 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13820 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
13830 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
13840 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
13850 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
13860 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
13870 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
13880 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
13890 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
138a0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
138b0 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
138c0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
138d0 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
138e0 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
138f0 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
13900 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
13910 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
13920 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
13930 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13940 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
13950 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
13960 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
13970 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
13980 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
13990 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
139a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
139b0 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
139c0 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
139d0 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
139e0 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
139f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
13a00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
13a10 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
13a20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
13a30 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
13a40 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
13a50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a60 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
13a70 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
13a80 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
13a90 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
13aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13ab0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
13ac0 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
13ad0 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
13ae0 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
13af0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13b00 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13b10 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
13b20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
13b30 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
13b40 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
13b50 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
13b60 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
13b70 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
13b80 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
13b90 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
13ba0 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
13bb0 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
13bc0 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
13bd0 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
13be0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
13bf0 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
13c00 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
13c10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
13c20 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
13c30 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
13c40 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
13c50 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
13c60 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
13c70 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
13c80 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
13c90 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
13ca0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
13cb0 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
13cc0 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
13cd0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
13ce0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
13cf0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
13d00 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
13d10 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
13d20 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
13d30 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
13d40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13d50 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
13d60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13d70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
13d80 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
13d90 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
13da0 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
13db0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
13dc0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
13dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
13de0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
13df0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
13e00 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
13e30 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
13e40 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
13e50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
13e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13e70 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
13e80 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
13e90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13ea0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13eb0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
13ec0 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
13ed0 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
13ee0 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
13ef0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
13f00 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
13f10 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
13f20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13f30 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
13f40 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
13f50 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
13f60 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13f70 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
13f80 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
13f90 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
13fa0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
13fb0 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
13fc0 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
13fd0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13fe0 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
13ff0 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
14000 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14010 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
14020 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
14030 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
14040 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
14050 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
14060 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
14080 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
14090 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
140a0 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
140b0 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
140c0 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
140d0 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
140e0 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
140f0 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
14100 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
14110 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
14120 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
14130 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
14140 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
14150 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14160 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
14170 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
14180 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14190 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
141a0 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
141b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
141c0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
141d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
141e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
141f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14210 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
14220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14240 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
14250 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
14260 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
14270 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14290 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
142a0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
142b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
142c0 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
142d0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
142e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
142f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
14300 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
14310 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
14320 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
14330 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
14340 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
14350 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
14360 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
14370 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
14380 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
14390 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
143a0 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
143b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
143c0 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
143d0 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
143e0 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
143f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14400 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
14410 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14420 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
14430 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
14440 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
14450 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
14460 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
14470 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
14480 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
14490 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
144a0 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
144b0 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
144c0 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
144d0 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
144e0 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
144f0 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
14500 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
14510 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14520 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
14530 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14540 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
14550 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14560 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
14570 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
14580 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
14590 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
145a0 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
145b0 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
145c0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
145d0 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
145e0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
145f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14600 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
14610 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14620 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
14630 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
14640 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
14650 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
14660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14670 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
14680 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61  of(MemPage), fla
14690 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
146a0 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
146b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
146c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
146d0 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
146e0 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
146f0 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
14700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14710 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
14720 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
14730 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
14740 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
14750 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
14760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14770 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
14780 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
14790 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
147a0 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
147b0 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
147c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
147d0 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  etBusyHandler(pB
147e0 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
147f0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
14800 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
14810 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
14820 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
14830 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
14840 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
14850 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
14860 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
14870 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
14880 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
14890 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e  _ONLY;.#if defin
148a0 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ed(SQLITE_SECURE
148b0 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74  _DELETE).    pBt
148c0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
148d0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
148e0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
148f0 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52  QLITE_FAST_SECUR
14900 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42  E_DELETE).    pB
14910 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14920 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65  TS_OVERWRITE;.#e
14930 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44  ndif.    /* EVID
14940 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
14950 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
14960 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
14970 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
14980 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
14990 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
149a0 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
149b0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
149c0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
149d0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
149e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
149f0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d  ile. */.    pBt-
14a00 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
14a10 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
14a20 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
14a30 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
14a40 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
14a50 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
14a60 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
14a70 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
14a80 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
14a90 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
14aa0 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
14ab0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
14ac0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
14ad0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14ae0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
14af0 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
14b00 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
14b10 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
14b20 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
14b30 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
14b40 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
14b50 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
14b60 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
14b70 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
14b80 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14b90 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
14ba0 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
14bb0 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
14bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
14bd0 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
14be0 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
14bf0 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
14c00 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
14c10 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
14c20 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
14c30 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
14c40 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
14c50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14c60 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
14c70 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
14c80 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
14c90 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
14ca0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
14cb0 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
14cc0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
14cd0 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
14ce0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
14cf0 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
14d00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
14d10 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
14d20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14d30 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
14d40 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
14d50 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
14d60 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
14d70 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74   is.      ** det
14d80 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
14d90 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
14da0 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
14db0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
14dc0 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  0.      ** into 
14dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14de0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
14df0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
14e00 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
14e10 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14e20 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
14e30 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
14e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14e50 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
14e60 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
14e70 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
14e80 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
14e90 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
14ea0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
14eb0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
14ec0 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
14ed0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
14ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14ef0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
14f00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
14f10 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
14f20 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
14f30 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
14f40 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
14f50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
14f60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
14f70 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
14f80 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
14f90 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
14fa0 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
14fb0 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
14fc0 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
14fd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14fe0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
14ff0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15000 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
15010 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
15020 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
15030 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
15040 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
15050 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
15060 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d  .    pBt->nRef =
15070 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   1;.    if( p->s
15080 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
15090 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
150a0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
150b0 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
150c0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
150d0 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
150e0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
150f0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
15100 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
15110 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
15120 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
15130 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15140 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
15150 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
15160 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15170 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
15180 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
15190 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
151a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
151b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
151c0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
151d0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
151e0 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
151f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15210 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
15220 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
15230 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
15240 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15250 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
15260 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
15270 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15280 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
15290 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
152a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
152b0 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
152c0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
152d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
152e0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
152f0 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
15300 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
15310 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
15320 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
15330 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
15340 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
15350 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
15360 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
15370 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
15380 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
15390 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
153a0 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
153b0 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
153c0 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
153d0 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
153e0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
153f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
15400 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
15410 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
15420 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
15430 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
15440 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
15450 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
15460 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
15470 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
15480 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
15490 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
154a0 20 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d      if( (uptr)p-
154b0 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d  >pBt<(uptr)pSib-
154c0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
154d0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
154e0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
154f0 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
15500 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
15510 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
15520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
15530 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
15540 74 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d  t && (uptr)pSib-
15550 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74  >pNext->pBt<(upt
15560 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  r)p->pBt ){.    
15570 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
15580 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
15590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
155a0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
155b0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
155c0 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
155d0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
155e0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
155f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
15600 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
15610 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15620 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
15630 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
15640 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15650 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15660 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
15670 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
15680 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
15690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
156a0 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
156b0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
156c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
156d0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
156e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
156f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15700 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
15710 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
15720 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
15730 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15740 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20  _file *pFile;.. 
15750 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
15760 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
15770 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
15780 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
15790 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
157a0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
157b0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
157c0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
157d0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
157e0 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
157f0 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
15800 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
15810 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
15820 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15830 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
15840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
15850 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15860 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
15870 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
15880 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
15890 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69  ;.    }..    pFi
158a0 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
158b0 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
158c0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  r);.    if( pFil
158d0 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  e->pMethods ){. 
158e0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69       sqlite3OsFi
158f0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46  leControlHint(pF
15900 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ile, SQLITE_FCNT
15910 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70  L_PDB, (void*)&p
15920 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  Bt->db);.    }. 
15930 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
15940 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
15950 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15960 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
15970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
15980 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
15990 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Open);.  }.  ass
159a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
159b0 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  OK || sqlite3Btr
159c0 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e  eeConnectionCoun
159d0 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b  t(*ppBtree)>0 );
159e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
159f0 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
15a00 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
15a10 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
15a20 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
15a30 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
15a40 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
15a50 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
15a60 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
15a70 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
15a80 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
15a90 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
15aa0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
15ab0 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
15ac0 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
15ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15ae0 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
15af0 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
15b00 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
15b10 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15b20 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c  _CACHE.  MUTEX_L
15b30 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
15b40 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a  tex *pMaster; ).
15b50 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
15b60 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
15b70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
15b80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
15b90 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
15ba0 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  x) );.  MUTEX_LO
15bb0 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
15bc0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
15bd0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
15be0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
15bf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15c00 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
15c10 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
15c20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
15c30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
15c40 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
15c50 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
15c60 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
15c70 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
15c80 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15c90 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
15ca0 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
15cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
15cc0 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
15cd0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15ce0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
15cf0 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
15d00 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
15d10 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
15d20 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
15d30 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
15d40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
15d50 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
15d60 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
15d70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
15d80 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
15d90 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
15da0 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
15db0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15dc0 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
15dd0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
15de0 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
15df0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15e00 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
15e10 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
15e20 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
15e30 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
15e40 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
15e50 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
15e60 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
15e70 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
15e80 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
15e90 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65  es with a 4-byte
15ea0 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65   prefix for a le
15eb0 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e  ft-child.** poin
15ec0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
15ed0 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
15ee0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
15ef0 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
15f00 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
15f10 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15f20 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
15f30 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
15f40 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
15f50 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20  One of the uses 
15f60 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  of pBt->pTmpSpac
15f70 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63  e is to format c
15f80 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20  ells before.    
15f90 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65  ** inserting the
15fa0 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61  m into a leaf pa
15fb0 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c  ge (function fil
15fc0 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20  lInCell()). If. 
15fd0 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20     ** a cell is 
15fe0 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65  less than 4 byte
15ff0 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73  s in size, it is
16000 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
16010 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79   bytes.    ** by
16020 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75   the various rou
16030 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70  tines that manip
16040 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c  ulate binary cel
16050 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a  ls. Which.    **
16060 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66   can mean that f
16070 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79  illInCell() only
16080 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
16090 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20   first 2 or 3.  
160a0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54    ** bytes of pT
160b0 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61  mpSpace, but tha
160c0 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  t the first 4 by
160d0 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66  tes are copied f
160e0 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e  rom.    ** it in
160f0 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61  to a database pa
16100 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ge. This is not 
16110 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c  actually a probl
16120 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a  em, but it.    *
16130 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76  * does cause a v
16140 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68  algrind error wh
16150 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79  en the 1 or 2 by
16160 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a  tes of unitializ
16170 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ed .    ** data 
16180 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73  is passed to sys
16190 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29  tem call write()
161a0 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68  . So to avoid th
161b0 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a  is error,.    **
161c0 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
161d0 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20  4 bytes of temp 
161e0 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20  space here..    
161f0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20  **.    ** Also: 
16200 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79   Provide four by
16210 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  tes of initializ
16220 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ed space before 
16230 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e  the.    ** begin
16240 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63  ning of pTmpSpac
16250 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61  e as an area ava
16260 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e  ilable to prepen
16270 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66  d the.    ** lef
16280 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
16290 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
162a0 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20   of a cell..    
162b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  */.    if( pBt->
162c0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
162d0 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70     memset(pBt->p
162e0 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b  TmpSpace, 0, 8);
162f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  .      pBt->pTmp
16300 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20  Space += 4;.    
16310 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
16320 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
16330 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
16340 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
16350 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
16360 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16370 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
16380 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
16390 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a  pTmpSpace -= 4;.
163a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
163b0 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  ree(pBt->pTmpSpa
163c0 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54  ce);.    pBt->pT
163d0 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d  mpSpace = 0;.  }
163e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
163f0 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
16400 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
16410 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
16420 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16430 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
16440 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16450 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
16460 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
16470 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
16480 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
16490 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
164a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
164b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
164c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
164d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
164e0 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20  er(p);.  pCur = 
164f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
16500 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
16510 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
16520 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
16530 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
16540 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
16550 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
16560 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
16570 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
16580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16590 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
165a0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
165b0 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
165c0 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
165d0 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
165e0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
165f0 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
16600 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
16610 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
16620 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
16630 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
16640 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f  back(p, SQLITE_O
16650 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
16660 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
16670 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
16680 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
16690 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
166a0 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
166b0 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
166c0 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
166d0 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
166e0 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
166f0 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
16700 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
16710 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
16720 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
16730 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
16740 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
16750 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
16760 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
16770 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
16780 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
16790 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
167a0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
167b0 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
167c0 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
167d0 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
167e0 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
167f0 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
16800 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
16810 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
16820 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
16830 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
16840 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
16850 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
16860 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
16870 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
16880 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
16890 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
168a0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
168b0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
168c0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
168d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
168e0 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
168f0 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
16900 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
16910 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
16920 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
16930 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
16940 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
16950 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
16960 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
16970 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
16980 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
16990 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
169a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
169b0 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
169c0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
169d0 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
169e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
169f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16a00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
16a10 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20  ange the "soft" 
16a20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
16a30 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
16a40 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e  the cache..** Un
16a50 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66  used and unmodif
16a60 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62  ied pages will b
16a70 65 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20  e recycled when 
16a80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
16a90 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
16aa0 63 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73  che exceeds this
16ab0 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75   soft limit.  Bu
16ac0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
16ad0 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c  e.** cache is al
16ae0 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61  lowed to grow la
16af0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c  rger than this l
16b00 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61  imit if it conta
16b10 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  ins.** dirty pag
16b20 65 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c  es or pages stil
16b30 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e  l in active use.
16b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16b50 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
16b60 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
16b70 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
16b80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16b90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16ba0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16bb0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16bc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16bd0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
16be0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
16bf0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
16c00 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
16c10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16c20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16c30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
16c40 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22  ange the "spill"
16c50 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
16c60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
16c70 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49   the cache..** I
16c80 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
16c90 70 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68  pages exceeds th
16ca0 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20  is limit during 
16cb0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
16cc0 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ion,.** the page
16cd0 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20  r might attempt 
16ce0 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73  to "spill" pages
16cf0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
16d00 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65  early in.** orde
16d10 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
16d20 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ory..**.** The v
16d30 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
16d40 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69   the current spi
16d50 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72  ll size.  If zer
16d60 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61  o is passed.** a
16d70 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e  s an argument, n
16d80 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
16d90 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20  de to the spill 
16da0 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f  size setting, so
16db0 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65  .** using mxPage
16dc0 20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74   of 0 is a way t
16dd0 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72  o query the curr
16de0 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a  ent spill size..
16df0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16e00 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
16e10 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
16e20 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
16e30 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16e40 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
16e50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16e60 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16e70 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16e80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16e90 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
16ea0 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
16eb0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
16ec0 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
16ed0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16ee0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
16ef0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
16f00 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
16f10 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
16f20 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
16f30 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
16f40 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
16f50 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
16f60 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
16f70 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
16f80 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
16f90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
16fa0 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
16fb0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16fc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16fd0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16fe0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16ff0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17000 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
17010 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
17020 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
17030 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
17040 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17060 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
17070 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
17080 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
17090 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
170a0 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
170b0 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
170c0 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
170d0 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
170e0 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
170f0 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
17100 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
17110 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
17120 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
17130 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
17140 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
17150 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
17160 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
17170 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
17180 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
17190 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
171a0 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
171b0 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
171c0 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
171d0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
171e0 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
171f0 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
17200 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
17210 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
17220 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
17230 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
17240 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
17250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
17260 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
17270 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
17280 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
17290 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
172a0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
172b0 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
172c0 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
172d0 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
172e0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
172f0 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
17300 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
17310 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
17320 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17330 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
17340 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
17350 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17360 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
17370 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
17380 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
17390 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
173a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
173b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
173c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
173d0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
173e0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
173f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17400 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
17410 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
17420 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
17430 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17440 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
17450 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
17460 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
17470 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
17480 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
17490 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
174a0 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
174b0 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
174c0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
174d0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
174e0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
174f0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
17500 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
17510 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
17520 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
17530 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
17540 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
17550 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
17560 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
17570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17580 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
17590 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
175a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
175b0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
175c0 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
175d0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
175e0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
175f0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
17600 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
17610 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
17620 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
17630 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
17640 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
17650 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
17660 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
17670 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
17680 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
17690 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
176a0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
176b0 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
176c0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
176d0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
176e0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
176f0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
17700 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
17710 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
17720 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
17730 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
17740 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
17750 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
17760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
17770 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17780 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
17790 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
177a0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
177b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
177c0 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49  ter(p);.#if SQLI
177d0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
177e0 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d  f( nReserve>pBt-
177f0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
17800 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ) pBt->optimalRe
17810 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73  serve = (u8)nRes
17820 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  erve;.#endif.  i
17830 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
17840 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
17850 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
17860 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17870 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17880 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17890 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
178a0 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
178b0 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
178c0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
178d0 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
178e0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
178f0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
17900 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
17910 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
17920 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
17930 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
17940 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
17950 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
17960 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17970 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
17980 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17990 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
179a0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
179b0 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
179c0 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
179d0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
179e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
179f0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
17a00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
17a10 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
17a20 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
17a30 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
17a40 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
17a50 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
17a60 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
17a70 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
17a80 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
17a90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17aa0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17ac0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
17ad0 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
17ae0 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
17af0 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
17b00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
17b10 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
17b20 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
17b30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
17b40 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
17b50 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
17b60 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
17b70 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
17b80 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
17b90 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
17ba0 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
17bb0 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
17bc0 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
17bd0 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
17be0 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
17bf0 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
17c00 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
17c10 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
17c20 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
17c30 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
17c40 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
17c50 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
17c60 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
17c70 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
17c80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
17c90 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
17ca0 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
17cb0 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
17cc0 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
17cd0 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
17ce0 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
17cf0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17d00 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
17d10 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
17d20 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
17d30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
17d40 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
17d50 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
17d60 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   n;.  assert( sq
17d70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17d80 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
17d90 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
17da0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
17db0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
17dc0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
17dd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17de0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17df0 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
17e00 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
17e10 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
17e20 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
17e30 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
17e40 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
17e50 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
17e60 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
17e70 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a  y extensions..**
17e80 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41  .** If SQLITE_HA
17e90 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e  S_MUTEX is defin
17ea0 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed then the numb
17eb0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  er returned is t
17ec0 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66  he.** greater of
17ed0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
17ee0 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20  erved space and 
17ef0 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75  the maximum requ
17f00 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65  ested.** reserve
17f10 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73   space..*/.int s
17f20 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70  qlite3BtreeGetOp
17f30 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72  timalReserve(Btr
17f40 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
17f50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17f60 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
17f70 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17f80 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b  serveNoMutex(p);
17f90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
17fa0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
17fb0 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  <p->pBt->optimal
17fc0 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d  Reserve ) n = p-
17fd0 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17fe0 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73  erve;.#endif.  s
17ff0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18000 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
18010 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
18020 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
18030 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
18040 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
18050 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
18060 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
18070 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
18080 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
18090 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
180a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
180b0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
180c0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
180d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
180e0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
180f0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
18100 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
18110 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
18120 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
18130 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
18140 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
18150 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
18160 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
18170 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18180 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
18190 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
181a0 65 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53  es for the BTS_S
181b0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
181c0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66   BTS_OVERWRITE f
181d0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e  lags:.**.**    n
181e0 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20  ewFlag==0       
181f0 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f  Both BTS_SECURE_
18200 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f  DELETE and BTS_O
18210 56 45 52 57 52 49 54 45 20 61 72 65 20 63 6c 65  VERWRITE are cle
18220 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
18230 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f  ag==1       BTS_
18240 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65  SECURE_DELETE se
18250 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  t and BTS_OVERWR
18260 49 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a  ITE is cleared.*
18270 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20  *    newFlag==2 
18280 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45        BTS_SECURE
18290 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20  _DELETE cleared 
182a0 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
182b0 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e  E is set.**    n
182c0 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20  ewFlag==(-1)    
182d0 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a  No changes.**.**
182e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
182f0 74 73 20 61 73 20 61 20 71 75 65 72 79 20 69 66  ts as a query if
18300 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73   newFlag is less
18310 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a   than zero.**.**
18320 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52   With BTS_OVERWR
18330 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64  ITE set, deleted
18340 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72   content is over
18350 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73  written by zeros
18360 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73  , but.** freelis
18370 74 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65  t leaf pages are
18380 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63   not written bac
18390 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
183a0 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65  e.  Thus in-page
183b0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  .** deleted cont
183c0 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ent is cleared, 
183d0 62 75 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c  but freelist del
183e0 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
183f0 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  not..**.** With 
18400 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18410 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  E, operation is 
18420 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49  like BTS_OVERWRI
18430 54 45 20 77 69 74 68 20 74 68 65 20 61 64 64 69  TE with the addi
18440 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65  tion.** that fre
18450 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  elist leaf pages
18460 20 61 72 65 20 77 72 69 74 74 65 6e 20 62 61 63   are written bac
18470 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
18480 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a  ase, increasing.
18490 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ** the amount of
184a0 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e   disk I/O..*/.in
184b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
184c0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
184d0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
184e0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
184f0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
18500 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
18510 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
18520 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49  ert( BTS_OVERWRI
18530 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44  TE==BTS_SECURE_D
18540 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73  ELETE*2 );.  ass
18550 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45  ert( BTS_FAST_SE
18560 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57  CURE==(BTS_OVERW
18570 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f  RITE|BTS_SECURE_
18580 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28  DELETE) );.  if(
18590 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
185a0 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
185b0 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54  ags &= ~BTS_FAST
185c0 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e  _SECURE;.    p->
185d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
185e0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
185f0 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a  TE*newFlag;.  }.
18600 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
18610 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41  tsFlags & BTS_FA
18620 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53  ST_SECURE)/BTS_S
18630 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
18640 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18650 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
18660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
18670 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
18680 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
18690 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
186a0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
186b0 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
186c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
186d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
186e0 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
186f0 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
18700 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
18710 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
18720 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
18730 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
18740 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
18750 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
18760 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
18770 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
18780 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
18790 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
187a0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
187b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
187c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
187d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
187e0 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
187f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18800 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
18810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
18820 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
18830 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
18840 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18850 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
18860 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
18870 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
18880 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
18890 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
188a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
188b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
188c0 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
188d0 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
188e0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
188f0 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
18900 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
18910 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18920 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
18930 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
18940 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
18950 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
18960 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
18970 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
18980 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
18990 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
189a0 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
189b0 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
189c0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
189d0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
189e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
189f0 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
18a00 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
18a10 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
18a20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18a30 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
18a40 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
18a50 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
18a60 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
18a70 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
18a80 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
18a90 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
18aa0 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
18ab0 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
18ac0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18ad0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18ae0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
18af0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  ./*.** If the us
18b00 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74  er has not set t
18b10 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
18b20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
18b30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
18b40 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79  using "PRAGMA sy
18b50 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20  nchronous", and 
18b60 69 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65  if the safety-le
18b70 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  vel is not alrea
18b80 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  dy.** set to the
18b90 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   value passed to
18ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18bb0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
18bc0 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69  ameter,.** set i
18bd0 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  t so..*/.#if SQL
18be0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
18bf0 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f  HRONOUS!=SQLITE_
18c00 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
18c10 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26  HRONOUS \.    &&
18c20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18c30 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69  _OMIT_WAL).stati
18c40 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c  c void setDefaul
18c50 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72  tSyncFlag(BtShar
18c60 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65  ed *pBt, u8 safe
18c70 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c  ty_level){.  sql
18c80 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
18c90 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70  pDb;.  if( (db=p
18ca0 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
18cb0 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
18cc0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  {.    while( pDb
18cd0 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d  ->pBt==0 || pDb-
18ce0 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29  >pBt->pBt!=pBt )
18cf0 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69  { pDb++; }.    i
18d00 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74  f( pDb->bSyncSet
18d10 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62  ==0 .     && pDb
18d20 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ->safety_level!=
18d30 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20  safety_level .  
18d40 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e     && pDb!=&db->
18d50 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20  aDb[1] .    ){. 
18d60 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
18d70 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f  _level = safety_
18d80 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c  level;.      sql
18d90 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
18da0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20  s(pBt->pPager,. 
18db0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
18dc0 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
18dd0 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
18de0 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
18df0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
18e00 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61  # define setDefa
18e10 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
18e20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65  safety_level).#e
18e30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ndif../*.** Get 
18e40 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
18e50 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
18e60 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
18e70 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
18e80 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
18e90 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
18ea0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
18eb0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
18ec0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
18ed0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
18ee0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
18ef0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
18f00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
18f10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
18f20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
18f30 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
18f40 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
18f50 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
18f60 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
18f70 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
18f80 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
18f90 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
18fa0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
18fb0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
18fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
18fd0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
18fe0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
18ff0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
19000 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
19010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19020 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
19030 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
19040 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19050 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19060 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
19070 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
19080 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
19090 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
190a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
190b0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
190c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
190d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
190e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
190f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
19100 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19110 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19120 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
19130 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
19140 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19150 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
19160 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
19170 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
19180 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
19190 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
191a0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
191b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
191c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
191d0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
191e0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
191f0 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
19200 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
19210 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
19220 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
19230 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
19240 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
19250 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
19260 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
19270 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
19280 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
19290 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
192a0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
192b0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
192c0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
192d0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
192e0 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
192f0 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
19300 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
19310 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
19320 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
19330 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
19340 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
19350 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
19360 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
19370 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
19380 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19390 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
193a0 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
193b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
193c0 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
193d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
193e0 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
193f0 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
19400 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
19410 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
19420 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
19430 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
19440 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
19450 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
19460 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19470 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
19480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
19490 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
194a0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
194b0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
194c0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
194d0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
194e0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
194f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
19500 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19510 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
19520 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
19530 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
19540 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
19550 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
19560 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
19570 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
19580 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
19590 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
195a0 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
195b0 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
195c0 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
195d0 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
195e0 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
195f0 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
19600 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
19610 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
19620 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
19630 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
19640 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
19650 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
19660 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
19670 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
19680 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
19690 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
196a0 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
196b0 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
196c0 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
196d0 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
196e0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
196f0 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
19700 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
19710 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
19720 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
19730 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
19740 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
19750 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
19760 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
19770 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
19780 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
19790 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
197a0 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
197b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
197c0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
197d0 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
197e0 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
197f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19800 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
19810 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19830 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
19840 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
19850 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
19860 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a  SYNCHRONOUS+1);.
19870 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
19880 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
19890 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
198a0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
198b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
198c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
198d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
198e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
198f0 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  B;.    }else{.  
19900 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79      setDefaultSy
19910 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49  ncFlag(pBt, SQLI
19920 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
19930 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d  RONOUS+1);.    }
19940 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
19950 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
19960 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d  5465-20813 The m
19970 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d  aximum and minim
19980 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c  um embedded payl
19990 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74  oad.    ** fract
199a0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61  ions and the lea
199b0 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  f payload fracti
199c0 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  on values must b
199d0 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32  e 64, 32, and 32
199e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
199f0 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
19a00 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
19a10 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
19a20 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
19a30 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
19a40 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
19a50 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
19a60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
19a70 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
19a80 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
19a90 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
19aa0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19ab0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19ac0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19ad0 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
19ae0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
19af0 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
19b00 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
19b10 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
19b20 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
19b30 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
19b40 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
19b50 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
19b60 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
19b70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
19b80 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
19b90 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
19ba0 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
19bb0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19bc0 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31  E-OF: R-25008-21
19bd0 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20  688 The size of 
19be0 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65  a page is a powe
19bf0 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20  r of two.    ** 
19c00 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
19c10 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e  65536 inclusive.
19c20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61   */.    if( ((pa
19c30 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
19c40 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
19c50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
19c60 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
19c70 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
19c80 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
19c90 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19ca0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19cb0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
19cc0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
19cd0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19ce0 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
19cf0 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
19d00 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
19d10 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
19d20 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
19d30 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
19d40 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
19d50 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
19d60 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
19d70 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
19d80 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
19d90 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
19da0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
19db0 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
19dc0 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
19dd0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
19de0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
19df0 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
19e00 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
19e10 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
19e20 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
19e30 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
19e40 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
19e50 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
19e60 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
19e70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
19e80 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
19e90 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
19ea0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
19eb0 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
19ec0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
19ed0 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
19ee0 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
19ef0 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
19f00 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
19f10 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
19f20 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
19f30 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
19f40 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
19f50 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
19f60 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
19f70 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
19f80 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
19f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
19fa0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
19fb0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
19fc0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
19fd0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
19fe0 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
19ff0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
1a000 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1a010 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
1a020 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1a030 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
1a040 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1a050 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
1a060 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
1a070 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a080 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1a090 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
1a0a0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
1a0b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
1a0e0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
1a0f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a100 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e  }.    if( (pBt->
1a110 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a120 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
1a130 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
1a140 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
1a150 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1a160 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1a170 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1a180 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1a190 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a1a0 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
1a1b0 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
1a1c0 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
1a1d0 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
1a1e0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
1a1f0 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
1a200 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
1a210 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
1a220 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
1a230 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
1a240 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
1a250 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
1a260 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
1a270 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a280 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a290 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
1a2a0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
1a2b0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
1a2c0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1a2d0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1a2e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1a2f0 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
1a300 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1a310 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
1a320 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
1a330 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
1a340 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1a350 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
1a360 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
1a370 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
1a380 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
1a390 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
1a3a0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
1a3b0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
1a3c0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
1a3d0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
1a3e0 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
1a3f0 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
1a400 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
1a410 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
1a420 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
1a430 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
1a440 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
1a450 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
1a460 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
1a470 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
1a480 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
1a490 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
1a4a0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
1a4b0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
1a4c0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
1a4d0 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
1a4e0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1a4f0 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
1a500 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
1a510 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
1a520 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
1a530 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
1a540 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
1a550 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
1a560 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
1a570 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
1a580 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
1a590 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
1a5a0 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
1a5b0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
1a5c0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
1a5d0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1a5e0 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
1a5f0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
1a600 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
1a610 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1a620 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1a630 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
1a640 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
1a650 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
1a660 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
1a670 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1a680 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1a690 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
1a6a0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
1a6b0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
1a6c0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1a6d0 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
1a6e0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1a6f0 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
1a700 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
1a710 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
1a720 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
1a730 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
1a740 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
1a750 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
1a760 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1a770 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a780 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
1a790 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
1a7a0 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1a7b0 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1a7c0 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1a7d0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1a7e0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1a7f0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1a800 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1a810 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1a820 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1a830 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1a840 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1a850 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1a860 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1a870 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1a880 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1a890 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1a8a0 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1a8b0 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1a8c0 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1a8d0 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1a8e0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1a8f0 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1a900 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1a910 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1a920 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1a930 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1a940 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1a950 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1a960 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1a970 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1a980 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1a990 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1a9a0 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1a9b0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1a9c0 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1a9d0 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1a9e0 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1a9f0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1aa00 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1aa10 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1aa20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1aa30 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1aa40 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1aa50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1aa60 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1aa70 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1aa80 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1aa90 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1aaa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1aab0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1aac0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1aad0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1aae0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1aaf0 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1ab00 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1ab10 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1ab20 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1ab30 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1ab40 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1ab50 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1ab60 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1ab70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1ab80 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1ab90 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1aba0 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1abb0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1abc0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1abd0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1abe0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1abf0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1ac00 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1ac10 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1ac20 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1ac30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ac40 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1ac50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1ac60 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1ac70 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1ac80 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1ac90 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1aca0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1acb0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1acc0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1acd0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1ace0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1acf0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1ad00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ad10 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1ad20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ad30 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1ad40 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1ad50 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1ad60 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1ad70 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1ad80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1ad90 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
1ada0 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
1adb0 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
1adc0 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
1add0 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
1ade0 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
1adf0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
1ae00 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
1ae10 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1ae20 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
1ae30 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
1ae40 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
1ae50 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
1ae60 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
1ae70 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1ae80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1ae90 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1aea0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
1aeb0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
1aec0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1aed0 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
1aee0 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
1aef0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
1af00 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
1af10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1af20 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
1af30 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1af40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1af50 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
1af60 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
1af70 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1af80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
1af90 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1afa0 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
1afb0 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
1afc0 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
1afd0 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
1afe0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1aff0 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
1b000 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
1b010 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
1b020 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1b030 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
1b040 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
1b050 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
1b060 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
1b070 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
1b080 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
1b090 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
1b0a0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
1b0b0 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
1b0c0 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
1b0d0 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
1b0e0 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
1b0f0 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
1b100 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
1b110 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
1b120 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
1b130 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1b140 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
1b150 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
1b160 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1b170 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
1b180 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
1b190 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
1b1a0 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
1b1b0 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
1b1c0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
1b1d0 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
1b1e0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
1b1f0 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
1b200 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1b210 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1b220 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
1b230 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
1b240 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
1b250 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
1b260 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1b270 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b280 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1b290 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1b2a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b2b0 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
1b2c0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
1b2d0 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
1b2e0 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
1b2f0 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
1b300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1b310 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1b320 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1b330 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1b340 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1b350 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
1b360 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1b370 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b380 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
1b390 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1b3a0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1b3b0 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
1b3c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b3d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b3e0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1b3f0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
1b400 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
1b410 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
1b420 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
1b430 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1b440 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
1b450 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
1b460 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
1b470 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
1b480 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
1b490 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
1b4a0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
1b4b0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
1b4c0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
1b4d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1b4e0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1b4f0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
1b500 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
1b510 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
1b520 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
1b530 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
1b540 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
1b550 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
1b560 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
1b570 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
1b580 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
1b590 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
1b5a0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
1b5b0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1b5c0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
1b5d0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1b5e0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
1b5f0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1b600 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
1b610 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1b620 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1b630 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1b640 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1b650 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1b660 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1b670 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1b680 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b690 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1b6a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b6b0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1b6c0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b6d0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1b6e0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b6f0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1b700 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b710 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1b720 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1b730 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1b740 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1b750 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1b760 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1b770 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1b780 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1b790 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1b7a0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1b7b0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1b7c0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1b7d0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1b7e0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1b7f0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1b800 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1b810 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1b820 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1b830 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1b840 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1b850 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1b860 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1b870 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1b880 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1b890 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1b8a0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1b8b0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1b8c0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1b8d0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1b8e0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1b8f0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1b900 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1b910 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1b920 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1b930 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1b940 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1b950 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1b960 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1b970 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1b980 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1b990 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1b9a0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1b9b0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1b9c0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1b9d0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1b9e0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1b9f0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1ba00 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1ba10 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1ba20 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1ba30 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1ba40 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1ba50 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1ba60 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1ba70 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1ba80 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1ba90 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1baa0 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
1bab0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1bac0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1bad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
1bae0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1baf0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1bb00 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1bb10 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
1bb20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
1bb30 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
1bb40 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
1bb50 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
1bb60 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1bb70 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1bb80 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
1bb90 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
1bba0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1bbb0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1bbc0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
1bbd0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1bbe0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
1bbf0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
1bc00 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
1bc10 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1bc20 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1bc30 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
1bc40 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
1bc50 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
1bc60 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1bc70 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1bc80 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1bc90 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1bca0 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1bcb0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1bcc0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1bcd0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1bce0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1bcf0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1bd00 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1bd10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bd20 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1bd30 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20    {.    sqlite3 
1bd40 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *pBlock = 0;.   
1bd50 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1bd60 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1bd70 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1bd80 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1bd90 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e  ction .    ** on
1bda0 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
1bdb0 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
1bdc0 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
1bdd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
1bde0 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c     ** requested,
1bdf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1be00 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  OCKED..    */.  
1be10 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1be20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1be30 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1be40 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e  ).     || (pBt->
1be50 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1be60 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29  ENDING)!=0.    )
1be70 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d  {.      pBlock =
1be80 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1be90 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
1bea0 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1beb0 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
1bec0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1bed0 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1bee0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1bef0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1bf00 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1bf10 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
1bf20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1bf30 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1bf40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1bf50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bf60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1bf70 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   pBlock ){.     
1bf80 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1bf90 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1bfa0 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   pBlock);.      
1bfb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1bfc0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1bfd0 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
1bfe0 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20  _begun;.    }.  
1bff0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
1c000 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
1c010 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1c020 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1c030 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1c040 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1c050 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1c060 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1c070 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1c080 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1c090 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1c0a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1c0b0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1c0c0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1c0d0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1c0e0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1c0f0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1c100 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1c110 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1c120 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1c130 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1c140 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1c150 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1c160 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1c170 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1c180 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1c190 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1c1a0 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1c1b0 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1c1c0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1c1d0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1c1e0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1c1f0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1c200 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1c210 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1c220 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1c230 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1c240 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1c250 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1c260 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1c270 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1c280 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1c290 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1c2a0 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1c2b0 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1c2c0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1c2d0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1c2e0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1c2f0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1c300 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1c310 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1c320 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1c330 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1c340 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1c350 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1c360 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1c370 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c380 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1c390 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1c3a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1c3b0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1c3c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c3d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1c3e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c3f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c400 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1c410 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
1c420 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
1c430 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1c440 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c460 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1c470 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1c480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c490 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1c4a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c4b0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
1c4c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1c4d0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1c4e0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
1c4f0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
1c500 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1c510 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
1c520 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
1c530 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
1c540 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  t) );.  sqlite3P
1c550 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d  agerResetLockTim
1c560 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65 72  eout(pBt->pPager
1c570 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1c580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1c590 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1c5a0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1c5b0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1c5c0 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
1c5d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1c5e0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
1c5f0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
1c600 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1c610 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65  ( p->lock.pBtree
1c620 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69  ==p && p->lock.i
1c630 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
1c640 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63      p->lock.eLoc
1c650 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20  k = READ_LOCK;. 
1c660 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70         p->lock.p
1c670 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
1c680 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  k;.        pBt->
1c690 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b  pLock = &p->lock
1c6a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1c6b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
1c6c0 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
1c6d0 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
1c6e0 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
1c6f0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
1c700 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1c710 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
1c720 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
1c730 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
1c740 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1c750 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1c760 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1c770 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  age1;.#ifndef SQ
1c780 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1c790 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73  _CACHE.      ass
1c7a0 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
1c7b0 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
1c7c0 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
1c7d0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1c7e0 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53  s &= ~BTS_EXCLUS
1c7f0 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77  IVE;.      if( w
1c800 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62  rflag>1 ) pBt->b
1c810 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45  tsFlags |= BTS_E
1c820 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66  XCLUSIVE;.#endif
1c830 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1c840 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
1c850 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
1c860 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
1c870 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
1c880 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
1c890 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
1c8a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
1c8b0 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
1c8c0 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
1c8d0 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
1c8e0 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
1c8f0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1c900 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
1c910 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
1c920 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1c930 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
1c940 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
1c950 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
1c960 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
1c970 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1c980 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
1c990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1c9a0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
1c9b0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1c9c0 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
1c9d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c9e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1c9f0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1ca00 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1ca10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1ca30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1ca40 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1ca50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ca60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72  }.    }.  }...tr
1ca70 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
1ca80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ca90 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1caa0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
1cab0 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
1cac0 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
1cad0 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
1cae0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
1caf0 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
1cb00 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1cb10 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1cb20 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
1cb30 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1cb40 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1cb50 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1cb60 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1cb70 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1cb80 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1cb90 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1cba0 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
1cbb0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
1cbc0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1cbd0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1cbe0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1cbf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1cc00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cc10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
1cc20 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
1cc30 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
1cc40 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
1cc50 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
1cc60 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
1cc70 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
1cc80 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1cc90 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
1cca0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
1ccb0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1ccc0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1ccd0 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
1cce0 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
1ccf0 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
1cd00 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
1cd10 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
1cd40 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
1cd50 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cd70 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
1cd80 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
1cd90 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1cdc0 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
1cdd0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1cde0 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
1cdf0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1ce00 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1ce10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1ce20 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1ce30 29 20 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67  ) );.  rc = pPag
1ce40 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49  e->isInit ? SQLI
1ce50 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69  TE_OK : btreeIni
1ce60 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1ce70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ce80 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1ce90 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1cea0 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
1ceb0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1cec0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
1ced0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1cee0 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
1cef0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
1cf00 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
1cf10 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1cf20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
1cf30 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1cf40 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
1cf50 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1cf60 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1cf70 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1cf80 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
1cf90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1cfa0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1cfb0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1cfc0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1cfd0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1cfe0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1cff0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1d000 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1d010 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1d020 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  &rc);.  }..  ret
1d030 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d040 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
1d050 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
1d060 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
1d070 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
1d080 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
1d090 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
1d0a0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
1d0b0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
1d0c0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
1d0d0 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
1d0e0 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
1d0f0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
1d100 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
1d110 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1d120 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1d130 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d150 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
1d160 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1d170 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
1d180 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1d190 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1d1a0 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
1d1b0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1d1c0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
1d1d0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
1d1e0 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
1d1f0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1d200 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
1d210 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1d220 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
1d230 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
1d240 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
1d260 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1d270 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1d280 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
1d290 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
1d2a0 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
1d2b0 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
1d2c0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
1d2d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d2e0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1d2f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1d300 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1d310 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
1d320 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
1d330 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1d340 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
1d350 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
1d360 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
1d370 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1d380 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
1d390 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
1d3a0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1d3b0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
1d3c0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
1d3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1d3e0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
1d3f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
1d400 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1d410 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
1d420 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1d430 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  int nCell;.    i
1d440 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d  nt rc;..    rc =
1d450 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f   pPage->isInit ?
1d460 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72   SQLITE_OK : btr
1d470 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1d480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1d490 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
1d4a0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1d4b0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
1d4c0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1d4d0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
1d4e0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1d4f0 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
1d500 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d510 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
1d520 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1d530 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  fo;.        pPag
1d540 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
1d550 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
1d560 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1d570 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
1d580 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
1d590 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1d5a0 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50  +info.nSize > pP
1d5b0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
1d5c0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
1d5d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1d5e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d5f0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
1d600 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1d610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
1d620 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43  rom==get4byte(pC
1d630 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1d640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1d650 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b   put4byte(pCell+
1d660 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54  info.nSize-4, iT
1d670 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
1d680 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1d690 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1d6a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d6b0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1d6c0 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
1d6d0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1d6e0 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
1d6f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d700 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d710 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1d720 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
1d730 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
1d740 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1d750 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
1d760 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1d770 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1d780 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
1d790 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d7a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d7b0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1d7c0 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1d7d0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d7e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d7f0 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
1d800 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1d810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1d820 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
1d830 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
1d840 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
1d850 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
1d860 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
1d870 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
1d880 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
1d890 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
1d8a0 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
1d8b0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1d8c0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
1d8d0 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1d8e0 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
1d8f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
1d900 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
1d910 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d920 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
1d930 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
1d940 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
1d950 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
1d960 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
1d970 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
1d980 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
1d990 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
1d9a0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1d9b0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
1d9c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
1d9d0 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
1d9e0 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
1d9f0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da10 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
1da20 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
1da30 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1da40 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
1da50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1da60 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
1da70 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1da80 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
1da90 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
1daa0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
1dab0 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
1dac0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1dad0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
1dae0 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
1daf0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1db00 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
1db10 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
1db20 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
1db30 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
1db40 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
1db50 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
1db60 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
1db70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
1db80 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1db90 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
1dba0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1dbb0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1dbc0 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
1dbd0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1dbe0 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
1dbf0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1dc00 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1dc10 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
1dc20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1dc30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1dc40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1dc50 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
1dc60 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
1dc70 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
1dc80 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
1dc90 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
1dca0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
1dcb0 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
1dcc0 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
1dcd0 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
1dce0 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
1dcf0 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
1dd00 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
1dd10 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
1dd20 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
1dd30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1dd40 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
1dd50 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
1dd60 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1dd70 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
1dd80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dd90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1dda0 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
1ddb0 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
1ddc0 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
1ddd0 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
1dde0 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
1ddf0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
1de00 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
1de10 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
1de20 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1de30 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
1de40 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1de50 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
1de60 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
1de70 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
1de80 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
1de90 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1dea0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
1deb0 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
1dec0 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
1ded0 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
1dee0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1def0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1df00 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
1df10 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1df20 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1df30 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
1df40 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1df50 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1df60 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1df70 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1df80 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1df90 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
1dfa0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
1dfb0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1dfc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1dfd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1dfe0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1dff0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
1e000 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
1e010 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1e020 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
1e030 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1e040 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
1e050 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1e060 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
1e070 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
1e080 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e090 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e0a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1e0b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
1e0c0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
1e0d0 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
1e0e0 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
1e0f0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
1e100 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
1e110 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
1e120 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
1e130 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1e140 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
1e150 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1e160 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
1e170 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1e180 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1e190 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
1e1a0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
1e1b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e1c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1e1d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e1e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e1f0 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
1e200 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1e210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
1e230 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1e240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e250 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1e260 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
1e270 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
1e280 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1e290 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
1e2a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1e2b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e2c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e2d0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1e2e0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
1e2f0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1e300 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1e310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e320 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1e330 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
1e340 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
1e350 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
1e360 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1e370 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
1e380 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
1e390 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
1e3a0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
1e3b0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
1e3c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
1e3d0 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
1e3e0 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
1e3f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
1e400 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
1e410 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
1e420 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
1e430 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
1e440 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
1e450 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1e460 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
1e470 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1e480 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
1e490 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
1e4a0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
1e4b0 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
1e4c0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
1e4d0 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
1e4e0 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
1e4f0 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
1e500 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
1e510 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
1e520 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
1e530 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
1e540 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
1e550 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1e560 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
1e570 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
1e580 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
1e590 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
1e5a0 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
1e5b0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
1e5c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
1e5d0 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
1e5e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
1e5f0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
1e600 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
1e610 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
1e620 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
1e630 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
1e640 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1e650 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
1e660 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
1e670 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
1e680 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1e690 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
1e6a0 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
1e6b0 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
1e6c0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
1e6d0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1e6e0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
1e6f0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1e700 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
1e710 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
1e720 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
1e730 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1e740 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e750 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
1e760 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
1e770 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1e780 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e790 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e7a0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
1e7b0 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
1e7c0 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
1e7d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
1e7e0 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
1e7f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e800 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
1e810 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
1e820 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
1e830 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
1e840 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e850 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
1e860 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
1e870 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e880 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1e890 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
1e8a0 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
1e8b0 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
1e8c0 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1e8d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e8e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e8f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e900 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1e910 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
1e920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e930 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e940 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
1e950 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1e960 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
1e970 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1e980 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
1e990 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1e9a0 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
1e9b0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
1e9c0 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
1e9d0 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
1e9e0 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
1e9f0 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
1ea00 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
1ea10 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
1ea20 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
1ea30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1ea40 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
1ea50 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
1ea60 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
1ea70 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
1ea80 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
1ea90 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1eaa0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
1eab0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
1eac0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1ead0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1eae0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1eaf0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1eb00 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
1eb10 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
1eb20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1eb30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eb40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1eb50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1eb60 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1eb70 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
1eb80 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1eb90 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1eba0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
1ebb0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
1ebc0 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
1ebd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
1ebe0 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
1ebf0 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
1ec00 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
1ec10 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
1ec20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1ec30 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
1ec40 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1ec50 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1ec60 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
1ec70 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
1ec80 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
1ec90 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1eca0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1ecb0 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
1ecc0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1ecd0 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
1ece0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
1ecf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ed00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ed10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
1ed20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
1ed30 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
1ed40 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
1ed50 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
1ed60 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
1ed70 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
1ed80 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
1ed90 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
1eda0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
1edb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1edc0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
1edd0 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
1ede0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1edf0 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
1ee00 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
1ee10 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
1ee20 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
1ee30 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
1ee40 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1ee50 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
1ee60 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
1ee70 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1ee80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1ee90 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
1eea0 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
1eeb0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
1eec0 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
1eed0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1eee0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1eef0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1ef00 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1ef10 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
1ef20 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
1ef30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ef40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ef50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ef60 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1ef70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ef80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ef90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1efa0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
1efb0 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
1efc0 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
1efd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1efe0 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
1eff0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
1f000 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
1f010 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
1f020 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
1f030 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
1f040 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1f050 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1f060 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f090 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1f0a0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1f0b0 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
1f0c0 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
1f0d0 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
1f0e0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1f0f0 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
1f100 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1f110 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
1f120 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f130 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
1f140 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
1f150 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f160 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f170 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
1f180 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1f190 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1f1a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1f1b0 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
1f1c0 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
1f1d0 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
1f1e0 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
1f1f0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
1f200 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f210 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
1f220 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
1f230 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
1f240 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
1f250 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
1f260 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1f270 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
1f280 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
1f290 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
1f2a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f2b0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
1f2c0 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
1f2d0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
1f2e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1f2f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f300 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
1f310 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1f320 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1f350 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
1f360 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
1f370 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
1f380 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
1f390 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
1f3a0 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
1f3b0 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
1f3c0 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
1f3d0 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
1f3e0 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
1f3f0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
1f400 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
1f410 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1f420 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
1f430 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1f440 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
1f450 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
1f460 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f470 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1f480 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
1f490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
1f4a0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1f4b0 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
1f4c0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
1f4d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
1f4e0 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
1f4f0 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
1f500 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
1f510 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1f520 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
1f530 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
1f540 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
1f550 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
1f560 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
1f570 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
1f580 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
1f590 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
1f5a0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
1f5b0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1f5c0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1f5d0 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
1f5e0 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
1f5f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f600 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
1f610 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1f620 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f630 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
1f640 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1f660 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1f670 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
1f680 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1f690 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
1f6a0 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
1f6b0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1f6c0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
1f6d0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
1f6e0 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1f6f0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
1f700 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
1f710 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f720 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1f730 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
1f740 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1f750 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
1f760 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
1f770 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
1f780 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f790 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
1f7a0 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
1f7b0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1f7c0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1f7d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1f7e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f7f0 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
1f800 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1f810 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1f820 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1f830 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
1f840 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
1f850 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1f860 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f880 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1f890 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1f8a0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1f8b0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f8c0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1f8d0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1f8e0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1f8f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1f900 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
1f910 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1f920 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1f930 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f940 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f950 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
1f960 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
1f970 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
1f980 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
1f990 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
1f9a0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
1f9b0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1f9c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1f9d0 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
1f9e0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1f9f0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
1fa00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fa10 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
1fa20 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
1fa30 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
1fa40 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
1fa50 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1fa60 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
1fa70 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
1fa80 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
1fa90 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
1faa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fab0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1fac0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
1fad0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1fae0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1faf0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1fb00 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
1fb10 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
1fb20 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1fb30 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20  nt(pPager); ).. 
1fb40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fb50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1fb60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
1fb70 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1fb80 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1fb90 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
1fba0 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
1fbb0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
1fbc0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
1fbd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1fbe0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1fbf0 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
1fc00 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
1fc10 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
1fc20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fc30 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1fc40 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
1fc50 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
1fc60 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
1fc70 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
1fc80 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1fc90 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
1fca0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1fcb0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
1fcc0 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
1fcd0 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1fce0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
1fcf0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1fd00 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
1fd10 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
1fd20 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1fd30 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
1fd40 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
1fd50 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
1fd60 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
1fd70 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
1fd80 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
1fd90 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
1fda0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
1fdb0 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
1fdc0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
1fdd0 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
1fde0 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
1fdf0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1fe00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fe10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1fe20 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
1fe30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1fe40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1fe50 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
1fe60 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1fe70 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1fe80 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
1fe90 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
1fea0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1feb0 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
1fec0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
1fed0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1fee0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1fef0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
1ff00 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
1ff10 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
1ff20 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
1ff30 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1ff40 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1ff50 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
1ff60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
1ff70 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
1ff80 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
1ff90 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
1ffa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ffb0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1ffc0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1ffd0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1ffe0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1fff0 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
20000 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20010 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20020 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
20030 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
20040 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
20050 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
20060 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
20070 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
20080 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
20090 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
200a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
200b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
200c0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
200d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
200e0 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
200f0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
20100 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
20110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
20120 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
20130 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20140 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
20150 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
20160 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
20170 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
20180 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
20190 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
201a0 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
201b0 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
201c0 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f  e.** causes a ro
201d0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
201e0 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66  o be created (if
201f0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
20200 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61  eady exist).** a
20210 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
20220 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61  h enough informa
20230 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tion so that if 
20240 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63  a power loss occ
20250 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  urs.** the datab
20260 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f  ase can be resto
20270 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
20280 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61  nal state by pla
20290 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65  ying back.** the
202a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20   journal.  Then 
202b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
202c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  the journal are 
202d0 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a  flushed out to.*
202e0 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74  * the disk.  Aft
202f0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
20300 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64  s safely on oxid
20310 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  e, the changes t
20320 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
20330 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
20340 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
20350 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64  file and flushed
20360 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74   to oxide..** At
20370 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
20380 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62   call, the rollb
20390 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c  ack journal stil
203a0 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a  l exists on the.
203b0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61  ** disk and we a
203c0 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  re still holding
203d0 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74   all locks, so t
203e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
203f0 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74  as not.** commit
20400 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ted.  See sqlite
20410 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20420 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73  eTwo() for the s
20430 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
20440 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
20450 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
20460 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
20470 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
20480 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
20490 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
204a0 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
204b0 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
204c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
204d0 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
204e0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
204f0 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
20500 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
20510 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
20520 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
20530 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
20540 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
20550 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
20560 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
20570 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20580 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
20590 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
205a0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
205b0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
205c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
205d0 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
205e0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
205f0 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
20600 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
20610 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
20620 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
20630 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
20640 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
20650 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
20660 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
20670 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
20680 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
20690 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
206a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
206b0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
206c0 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
206d0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
206e0 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
206f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
20700 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
20710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
20720 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
20730 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
20740 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20750 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c   p->pBt;.    sql
20760 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20770 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
20780 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
20790 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
207a0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
207b0 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
207c0 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  umCommit(pBt);. 
207d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
207e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
207f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20800 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
20810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20820 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
20830 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
20840 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
20850 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
20860 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
20870 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
20880 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
20890 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
208a0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
208b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
208c0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
208d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
208e0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
208f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
20900 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20910 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
20920 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20930 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
20940 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
20950 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
20960 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
20970 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20980 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
20990 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
209a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
209b0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
209c0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
209d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
209e0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
209f0 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
20a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
20a10 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
20a20 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
20a30 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
20a40 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
20a50 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
20a60 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
20a70 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
20a80 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
20a90 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
20aa0 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
20ab0 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
20ac0 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
20ad0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
20ae0 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
20af0 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
20b00 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
20b10 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
20b20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
20b30 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
20b40 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
20b50 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
20b60 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
20b70 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
20b80 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
20b90 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
20ba0 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
20bb0 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
20bc0 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
20bd0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
20be0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
20bf0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
20c00 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
20c10 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
20c20 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
20c30 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
20c40 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
20c50 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
20c60 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
20c70 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
20c80 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
20c90 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
20ca0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
20cb0 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
20cc0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
20cd0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
20ce0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
20cf0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
20d00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
20d10 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
20d20 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
20d30 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
20d40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
20d50 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
20d60 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
20d70 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
20d80 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
20d90 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
20da0 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
20db0 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
20dc0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
20dd0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
20de0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
20df0 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
20e00 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
20e10 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
20e20 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
20e30 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
20e40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
20e50 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
20e60 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
20e70 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
20e80 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
20e90 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
20ea0 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
20eb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
20ec0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
20ed0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
20ee0 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
20ef0 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
20f00 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
20f10 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
20f20 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
20f30 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
20f40 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
20f50 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
20f60 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
20f70 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
20f80 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
20f90 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
20fa0 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
20fb0 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
20fc0 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
20fd0 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
20fe0 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
20ff0 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
21000 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
21010 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
21020 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
21030 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
21040 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
21050 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
21060 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
21070 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
21080 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
21090 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
210a0 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
210b0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
210c0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
210d0 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
210e0 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
210f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
21100 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
21110 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
21120 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
21130 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
21140 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
21150 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
21160 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
21170 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
21180 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
21190 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
211a0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
211b0 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
211c0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
211d0 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
211e0 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
211f0 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
21200 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
21210 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
21220 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
21230 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
21240 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
21250 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
21260 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
21270 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
21280 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
21290 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
212a0 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
212b0 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
212c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
212d0 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
212e0 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
212f0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
21300 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
21310 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
21320 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
21330 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
21340 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
21350 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
21360 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
21370 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
21380 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
21390 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
213a0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
213b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
213c0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
213d0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
213e0 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
213f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
21400 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
21410 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
21420 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21430 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
21440 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
21450 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
21460 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
21470 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
21480 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
21490 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
214a0 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
214b0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
214c0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
214d0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
214e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
214f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
21500 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21510 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
21520 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
21530 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21540 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
21550 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
21560 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
21570 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21580 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
21590 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
215a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
215b0 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
215c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
215d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
215e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
215f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  c;.    }.    p->
21600 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20  iDataVersion--; 
21610 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66   /* Compensate f
21620 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  or pPager->iData
21630 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20  Version++; */.  
21640 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
21650 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
21660 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
21670 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
21680 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
21690 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
216a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
216b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
216c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
216d0 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
216e0 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
216f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21700 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
21710 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
21720 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
21730 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
21740 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21750 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
21760 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
21770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
21780 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
21790 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
217a0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
217b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
217c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
217d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
217e0 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
217f0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
21800 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
21810 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
21820 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
21830 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61  sor on any BtSha
21840 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
21850 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  ** references.  
21860 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f  Or if the writeO
21870 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  nly flag is set 
21880 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a  to 1, then only.
21890 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75  ** trip write cu
218a0 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20  rsors and leave 
218b0 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63  read cursors unc
218c0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76  hanged..**.** Ev
218d0 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20  ery cursor is a 
218e0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
218f0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
21900 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68  ng cursors.** th
21910 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68  at belong to oth
21920 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
21930 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
21940 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61  pen to be.** sha
21950 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77  ring the cache w
21960 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
21970 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
21980 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
21990 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
219a0 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  s. If the writeO
219b0 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  nly.** flag is t
219c0 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77  rue, then only w
219d0 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65  rite-cursors nee
219e0 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72  d be tripped - r
219f0 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
21a00 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63  ors save their c
21a10 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73  urrent positions
21a20 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61   so that they ma
21a30 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66  y continue .** f
21a40 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c  ollowing the rol
21a50 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72  lback. Or, if wr
21a60 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
21a70 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  , all cursors ar
21a80 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49  e .** tripped. I
21a90 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65  n general, write
21aa0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66  Only is false if
21ab0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21ac0 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64   being.** rolled
21ad0 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74   back modified t
21ae0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
21af0 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ma. In this case
21b00 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20   b-tree root.** 
21b10 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76  pages may be mov
21b20 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72  ed or deleted fr
21b30 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
21b40 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69  altogether, maki
21b50 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20  ng.** it unsafe 
21b60 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73  for read cursors
21b70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a   to continue..**
21b80 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65  .** If the write
21b90 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75  Only flag is tru
21ba0 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69  e and an error i
21bb0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
21bc0 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74  ile .** saving t
21bd0 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
21be0 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e  ion of a read-on
21bf0 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63  ly cursor, all c
21c00 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c  ursors, .** incl
21c10 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63  uding all read-c
21c20 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
21c30 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ed..**.** SQLITE
21c40 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
21c50 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
21c60 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
21c70 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61  curs while.** sa
21c80 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f  ving a cursor po
21c90 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74  sition, an SQLit
21ca0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
21cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21cc0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
21cd0 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
21ce0 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20  nt errCode, int 
21cf0 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74  writeOnly){.  Bt
21d00 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74  Cursor *p;.  int
21d10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21d20 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69  ..  assert( (wri
21d30 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69  teOnly==0 || wri
21d40 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54  teOnly==1) && BT
21d50 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20  CF_WriteFlag==1 
21d60 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
21d70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
21d80 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
21d90 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72  ;.    for(p=pBtr
21da0 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
21db0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
21dc0 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  {.      if( writ
21dd0 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
21de0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
21df0 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
21e00 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
21e10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21e20 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
21e30 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
21e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21e50 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
21e60 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
21e70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21e80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21e90 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
21ea0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
21eb0 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
21ec0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
21ed0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
21ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21f00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
21f10 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
21f20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
21f30 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
21f40 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
21f50 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
21f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74        }.      bt
21f70 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
21f80 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
21f90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
21fa0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
21fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
21fd0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
21fe0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
21ff0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
22000 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
22010 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
22020 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
22030 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
22040 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
22050 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
22060 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
22070 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
22080 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
22090 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
220a0 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
220b0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
220c0 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
220d0 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
220e0 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
220f0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
22100 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
22110 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
22120 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
22130 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
22140 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
22150 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
22160 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
22170 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22180 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
22190 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
221a0 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
221b0 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
221c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
221d0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
221e0 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
221f0 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
22200 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
22210 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22220 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
22230 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
22240 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
22250 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
22260 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
22270 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
22280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22290 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
222a0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
222b0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
222c0 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
222d0 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
222e0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
222f0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
22300 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
22310 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
22320 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
22330 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
22340 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
22350 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
22360 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
22370 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
22380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
22390 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
223a0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
223b0 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
223c0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
223d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
223e0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
223f0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
22400 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
22410 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
22420 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
22430 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
22440 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
22450 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
22460 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
22470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
22480 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
22490 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
224a0 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
224b0 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
224c0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
224d0 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
224e0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
224f0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
22500 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
22510 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
22520 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
22530 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
22540 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
22550 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
22560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
22570 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
22580 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
22590 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
225a0 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
225b0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
225c0 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
225d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
225e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
225f0 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
22600 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
22610 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
22620 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
22630 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
22640 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
22650 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22660 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
22670 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
22680 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
22690 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
226a0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
226b0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
226c0 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
226d0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
226e0 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
226f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
22700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22710 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
22720 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
22730 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
22740 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
22750 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
22760 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
22770 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
22780 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
22790 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
227a0 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
227b0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
227c0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
227d0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
227e0 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
227f0 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
22800 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
22810 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
22820 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
22830 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
22840 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
22850 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
22860 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
22870 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
22880 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
22890 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
228a0 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
228b0 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
228c0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
228d0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
228e0 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
228f0 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
22900 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
22910 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
22920 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
22930 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
22940 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
22950 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
22960 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
22970 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
22980 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
22990 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
229a0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
229b0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
229c0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
229d0 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
229e0 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
229f0 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
22a00 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
22a10 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
22a20 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
22a30 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
22a40 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
22a50 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
22a60 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
22a70 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
22a80 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
22a90 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
22aa0 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
22ab0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
22ac0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
22ad0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
22ae0 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
22af0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22b00 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
22b10 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
22b20 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
22b30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
22b40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
22b50 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22b60 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
22b70 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
22b80 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
22b90 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
22ba0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
22bb0 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
22bc0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
22bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
22be0 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
22bf0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
22c00 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
22c10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
22c20 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
22c30 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
22c40 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
22c50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
22c60 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
22c70 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
22c80 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
22c90 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
22ca0 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
22cb0 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
22cc0 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
22cd0 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
22ce0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
22cf0 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
22d00 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
22d10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
22d20 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
22d30 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
22d40 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
22d50 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
22d60 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
22d70 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
22d80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
22d90 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
22da0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
22db0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
22dc0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
22dd0 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
22de0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
22df0 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
22e00 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
22e10 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
22e20 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
22e30 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
22e40 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
22e50 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
22e60 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
22e70 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
22e80 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
22e90 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
22ea0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
22eb0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
22ec0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
22ed0 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
22ee0 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
22ef0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
22f00 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
22f10 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
22f20 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
22f30 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
22f40 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
22f50 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
22f60 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
22f70 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
22f80 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
22f90 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
22fa0 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
22fb0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
22fc0 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
22fd0 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
22fe0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
22ff0 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
23000 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
23010 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
23020 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23030 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
23040 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23050 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
23060 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
23070 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
23080 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
23090 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
230a0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
230b0 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
230c0 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
230d0 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
230e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
230f0 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
23100 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23110 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
23120 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23130 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
23140 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
23150 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
23160 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23180 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23190 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
231a0 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
231b0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
231c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
231d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
231e0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
231f0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
23200 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
23210 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
23220 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
23230 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
23240 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
23250 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
23260 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
23270 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
23280 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
23290 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
232a0 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
232b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
232c0 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
232d0 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
232e0 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
232f0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
23300 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
23310 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
23320 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
23330 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
23340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
23350 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
23360 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
23370 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
23380 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23390 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
233a0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
233b0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
233c0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
233d0 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
233e0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
233f0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
23400 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
23410 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
23420 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
23430 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
23440 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
23450 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
23460 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
23470 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
23480 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
23490 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
234a0 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
234b0 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
234c0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
234d0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
234e0 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
234f0 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65  of wrFlag is cle
23500 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ar, then the cur
23510 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20  sor can only.** 
23520 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
23530 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52  ing.  If the BTR
23540 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20  EE_WRCSR bit is 
23550 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  set, then the cu
23560 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75  rsor.** can be u
23570 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
23580 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  or for writing i
23590 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
235a0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  ns for writing.*
235b0 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  * are also met. 
235c0 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
235d0 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
235e0 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
235f0 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69  der.** for writi
23600 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64  ng to be allowed
23610 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
23620 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
23630 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
23640 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e  h wrFlag contain
23650 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a  ing BTREE_WRCSR.
23660 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
23670 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
23680 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
23690 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
236a0 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
236b0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
236c0 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
236d0 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
236e0 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
236f0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
23700 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
23710 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
23720 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
23730 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
23740 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
23750 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
23760 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
23770 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
23780 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
23790 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
237a0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
237b0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
237c0 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
237d0 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
237e0 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
237f0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
23800 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
23810 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  ion..**.** The B
23820 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62  TREE_FORDELETE b
23830 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79  it of wrFlag may
23840 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73   optionally be s
23850 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53  et if BTREE_WRCS
23860 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66  R.** is set.  If
23870 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65   FORDELETE is se
23880 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e  t, that is a hin
23890 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
238a0 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
238b0 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c  this cursor will
238c0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f   only be used to
238d0 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c   seek to and del
238e0 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61  ete entries of a
238f0 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61  n index.** as pa
23900 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44  rt of a larger D
23910 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  ELETE statement.
23920 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20    The FORDELETE 
23930 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  hint is not used
23940 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c   by.** this impl
23950 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74  ementation.  But
23960 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63   in a hypothetic
23970 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  al alternative s
23980 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a  torage engine .*
23990 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78  * in which index
239a0 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74   entries are aut
239b0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
239c0 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f  ed when correspo
239d0 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72  nding table.** r
239e0 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ows are deleted,
239f0 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66   the FORDELETE f
23a00 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68  lag is a hint th
23a10 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20  at all SEEK and 
23a20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74  DELETE.** operat
23a30 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72  ions on this cur
23a40 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70  sor can be no-op
23a50 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f  s and all READ o
23a60 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a  perations can .*
23a70 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20  * return a null 
23a80 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78  row (2-bytes: 0x
23a90 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20  01 0x00)..**.** 
23aa0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
23ab0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
23ac0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
23ad0 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
23ae0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
23af0 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
23b00 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
23b10 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
23b20 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
23b30 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
23b40 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
23b50 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
23b60 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
23b70 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
23b80 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
23b90 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
23ba0 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
23bb0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
23bc0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
23bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
23be0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
23bf0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
23c20 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
23c50 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
23c60 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
23c70 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
23ca0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
23cb0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
23cc0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23ce0 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
23cf0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
23d00 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
23d10 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
23d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23d30 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
23d40 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
23d50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
23d60 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
23d70 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
23d80 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
23d90 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23db0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
23dc0 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
23dd0 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
23de0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
23df0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
23e00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
23e10 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20  Flag==0 .       
23e20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45  || wrFlag==BTREE
23e30 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c  _WRCSR .       |
23e40 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45  | wrFlag==(BTREE
23e50 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52  _WRCSR|BTREE_FOR
23e60 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20  DELETE) .  );.. 
23e70 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
23e80 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
23e90 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
23ea0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
23eb0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
23ec0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
23ed0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
23ee0 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
23ef0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
23f00 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
23f10 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
23f20 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
23f30 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
23f40 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
23f50 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
23f60 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
23f70 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
23f80 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
23f90 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c  eyInfo!=0, (wrFl
23fa0 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73  ag?2:1)) );.  as
23fb0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
23fc0 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
23fd0 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
23fe0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
23ff0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
24000 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
24010 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
24020 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
24030 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
24040 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
24050 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
24060 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
24070 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
24080 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
24090 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
240a0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
240b0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
240c0 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
240d0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
240e0 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
240f0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
24100 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
24110 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
24120 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
24130 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24140 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
24150 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
24160 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
24170 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
24180 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
24190 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
241a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
241b0 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
241c0 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
241d0 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
241e0 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
241f0 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
24200 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
24210 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
24220 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
24230 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
24240 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
24250 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
24260 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
24270 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
24280 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
24290 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
242a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
242b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
242c0 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74  Flag ? BTCF_Writ
242d0 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75  eFlag : 0;.  pCu
242e0 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
242f0 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20   = wrFlag ? 0 : 
24300 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
24310 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  LY;.  /* If ther
24320 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
24330 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
24340 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
24350 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20  n all such.  ** 
24360 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68  cursors *must* h
24370 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  ave the BTCF_Mul
24380 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
24390 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d  */.  for(pX=pBt-
243a0 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58  >pCursor; pX; pX
243b0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
243c0 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f   if( pX->pgnoRoo
243d0 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20  t==(Pgno)iTable 
243e0 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72  ){.      pX->cur
243f0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
24400 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43  ltiple;.      pC
24410 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
24420 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
24430 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
24440 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
24450 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43  ursor;.  pBt->pC
24460 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
24470 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
24480 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
24490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
244a0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
244b0 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
244c0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
244f0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
24500 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
24530 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
24540 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
24550 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
24580 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
24590 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
245a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
245b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
245c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
245d0 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
245e0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
245f0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
24620 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
24630 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
24640 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72  Table<1 ){.    r
24650 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
24660 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
24670 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
24680 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
24690 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
246a0 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
246b0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
246c0 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
246d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
246e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
246f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24700 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
24710 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
24720 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
24730 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
24740 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
24750 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
24760 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
24770 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
24780 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
24790 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
247a0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
247b0 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
247c0 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
247d0 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
247e0 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
247f0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
24800 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
24810 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24820 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
24830 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
24840 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
24850 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
24860 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
24870 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
24880 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
24890 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
248a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
248b0 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
248c0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
248d0 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
248e0 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
248f0 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
24900 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
24910 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
24920 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
24930 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24940 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
24950 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
24960 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
24970 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
24980 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
24990 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
249a0 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
249b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
249c0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
249d0 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
249e0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
249f0 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
24a00 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55  BTCURSOR_FIRST_U
24a10 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NINIT));.}../*.*
24a20 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
24a30 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
24a40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24a50 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
24a60 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
24a70 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
24a80 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
24a90 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
24aa0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
24ab0 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
24ac0 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
24ad0 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
24ae0 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  e ){.    BtShare
24af0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
24b00 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
24b10 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
24b20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24b30 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  Bt->pCursor!=0 )
24b40 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
24b50 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a  Cursor==pCur ){.
24b60 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
24b70 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
24b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24b90 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72     BtCursor *pPr
24ba0 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ev = pBt->pCurso
24bb0 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
24bc0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e       if( pPrev->
24bd0 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20  pNext==pCur ){. 
24be0 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e           pPrev->
24bf0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
24c00 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ext;.          b
24c10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
24c20 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
24c30 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20  pPrev->pNext;.  
24c40 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41      }while( ALWA
24c50 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20  YS(pPrev) );.   
24c60 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65   }.    btreeRele
24c70 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
24c80 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c  s(pCur);.    unl
24c90 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
24ca0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
24cb0 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
24cc0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71  verflow);.    sq
24cd0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
24ce0 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  >pKey);.    sqli
24cf0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
24d00 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
24d10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24d20 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
24d30 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
24d40 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
24d50 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
24d60 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
24d70 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
24d80 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
24d90 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
24da0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
24db0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
24dc0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
24dd0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
24de0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
24df0 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
24e00 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
24e10 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
24e20 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
24e30 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
24e40 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
24e50 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
24e60 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 65  .  static int ce
24e70 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c  llInfoEqual(Cell
24e80 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66  Info *a, CellInf
24e90 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61  o *b){.    if( a
24ea0 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20  ->nKey!=b->nKey 
24eb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
24ec0 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21  if( a->pPayload!
24ed0 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72  =b->pPayload ) r
24ee0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
24ef0 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d   a->nPayload!=b-
24f00 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75  >nPayload ) retu
24f10 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
24f20 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63  >nLocal!=b->nLoc
24f30 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
24f40 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21     if( a->nSize!
24f50 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75  =b->nSize ) retu
24f60 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 0;.    return
24f70 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63   1;.  }.  static
24f80 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
24f90 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
24fa0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
24fb0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
24fc0 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
24fd0 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
24fe0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
24ff0 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
25000 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  r->ix, &info);. 
25010 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
25020 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66  PT_DB || cellInf
25030 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70  oEqual(&info, &p
25040 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20  Cur->info) );.  
25050 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
25060 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
25070 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (x).#endif.stati
25080 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
25090 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  E void getCellIn
250a0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
250b0 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
250c0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
250d0 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
250e0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
250f0 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65  dNKey;.    btree
25100 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
25110 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26  pPage,pCur->ix,&
25120 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
25130 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
25140 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
25150 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
25160 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
25170 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
25180 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
25190 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
251a0 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
251b0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
251c0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
251d0 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
251e0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
251f0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
25200 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
25210 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
25220 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
25230 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
25240 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
25250 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
25260 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
25270 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
25280 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
25290 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
252a0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
252b0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
252c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
252d0 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
252e0 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
252f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
25300 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
25310 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
25320 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
25330 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
25340 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25350 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
25360 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
25370 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
25380 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
25390 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
253a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
253b0 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
253c0 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
253d0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
253e0 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
253f0 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
25400 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
25410 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
25420 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
25430 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
25440 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
25450 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
25460 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
25470 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
25480 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25490 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
254a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
254b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
254c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
254d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
254e0 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
254f0 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
25500 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
25510 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
25520 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  .nKey;.}..#ifdef
25530 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
25540 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f  FFSET_SQL_FUNC./
25550 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25560 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
25570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
25580 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
25590 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f  he.** payload to
255a0 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
255b0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  r is pointing..*
255c0 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
255d0 65 65 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f  eeOffset(BtCurso
255e0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
255f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25600 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25610 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25620 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25630 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
25640 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
25650 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70  urn (i64)pCur->p
25660 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69  Bt->pageSize*((i
25670 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  64)pCur->pPage->
25680 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20  pgno - 1) +.    
25690 20 20 20 20 20 28 69 36 34 29 28 70 43 75 72 2d       (i64)(pCur-
256a0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  >info.pPayload -
256b0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44   pCur->pPage->aD
256c0 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ata);.}.#endif /
256d0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
256e0 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20  OFFSET_SQL_FUNC 
256f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
25700 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
25710 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
25720 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
25730 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75  at pCur is.** cu
25740 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
25750 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20   to.  For table 
25760 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c  btrees, this wil
25770 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a  l be the amount.
25780 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72  ** of data.  For
25790 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74   index btrees, t
257a0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
257b0 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e  size of the key.
257c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
257d0 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
257e0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
257f0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
25800 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
25810 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
25820 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
25830 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
25840 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
25850 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
25860 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
25870 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25880 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  LID..*/.u32 sqli
25890 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
258a0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
258b0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
258c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
258d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
258e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
258f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25900 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
25910 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
25920 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25930 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ad;.}../*.** Giv
25940 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
25950 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
25960 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
25970 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
25980 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
25990 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
259a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
259b0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
259c0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
259d0 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
259e0 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
259f0 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
25a00 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
25a10 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
25a20 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
25a30 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
25a40 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
25a50 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
25a60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25a70 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
25a80 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
25a90 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
25aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
25ab0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
25ac0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
25ad0 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
25ae0 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
25af0 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
25b00 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
25b10 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
25b20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
25b30 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
25b40 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
25b50 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
25b60 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
25b70 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
25b80 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
25b90 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
25ba0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
25bb0 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
25bc0 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
25bd0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
25be0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
25bf0 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
25c00 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
25c10 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
25c20 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
25c30 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
25c40 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
25c50 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
25c60 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
25c70 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
25c80 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
25c90 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
25ca0 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
25cb0 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
25cc0 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
25cd0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
25ce0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
25cf0 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
25d00 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
25d10 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
25d20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
25d30 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
25d40 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
25d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25d60 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
25d70 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
25d80 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
25d90 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
25da0 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
25db0 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
25dc0 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
25dd0 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
25de0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
25df0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
25e00 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
25e10 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
25e20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
25e30 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
25e40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
25e50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25e60 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
25e70 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
25e80 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
25e90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25ea0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
25eb0 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
25ec0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
25ed0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
25ee0 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
25ef0 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
25f00 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
25f10 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
25f20 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
25f30 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
25f40 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
25f50 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
25f60 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
25f70 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
25f80 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
25f90 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
25fa0 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
25fb0 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
25fc0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
25fd0 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
25fe0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
25ff0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26000 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
26010 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
26020 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
26030 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
26040 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
26050 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
26060 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
26070 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
26080 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
26090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
260a0 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
260b0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
260c0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
260d0 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
260e0 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
260f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
26110 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
26120 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
26130 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
26140 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
26150 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26160 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
26170 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
26180 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
26190 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
261a0 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
261b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
261c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
261d0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
261e0 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
261f0 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
26200 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
26210 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
26220 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
26230 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
26240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26250 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
26260 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
26270 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
26280 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
26290 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
262a0 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
262b0 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
262c0 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
262d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
262e0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
262f0 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
26300 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
26310 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
26320 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
26330 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
26340 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
26350 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
26360 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
26370 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
26380 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
26390 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
263a0 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
263b0 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
263c0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
263d0 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
263e0 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
263f0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
26400 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
26410 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
26420 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
26430 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
26440 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
26450 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
26460 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
26470 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
26480 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
26490 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
264a0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
264b0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
264c0 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
264d0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
264e0 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
264f0 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
26500 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
26510 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
26520 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
26530 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
26540 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
26550 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
26560 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
26570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26580 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
26590 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
265a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
265b0 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
265c0 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
265d0 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
265e0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
265f0 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
26600 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
26610 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
26620 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
26630 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
26640 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
26650 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
26660 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
26670 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26680 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
26690 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
266a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
266b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
266c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
266d0 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
266e0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
266f0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
26700 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
26710 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
26720 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
26730 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
26740 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
26750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26760 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
26770 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
26780 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
26790 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
267a0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
267b0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
267c0 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
267d0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
267e0 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
267f0 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
26800 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
26810 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
26820 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
26830 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
26840 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
26850 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
26860 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
26870 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
26880 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
26890 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
268a0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
268b0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
268c0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
268d0 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
268e0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
268f0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
26900 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
26910 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
26920 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
26930 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
26940 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
26950 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
26960 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
26970 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
26980 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
26990 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
269a0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
269b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a  overflow pages.*
269c0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
269d0 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
269e0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
269f0 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68  y populate.** th
26a00 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
26a10 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
26a20 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
26a30 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
26a40 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
26a50 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
26a60 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
26a70 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
26a80 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
26a90 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
26aa0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26ab0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
26ac0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
26ad0 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69   it must be.** i
26ae0 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
26af0 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
26b00 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
26b10 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
26b20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
26b30 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
26b40 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
26b50 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
26b60 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
26b70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
26b80 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
26b90 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
26ba0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26bb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
26bc0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
26bd0 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
26be0 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
26bf0 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
26c00 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
26c10 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
26c20 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
26c30 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
26c40 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
26c50 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
26c60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
26c70 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
26c80 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
26c90 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
26ca0 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
26cb0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
26cc0 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
26cd0 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
26ce0 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
26cf0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
26d00 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
26d10 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
26d20 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
26d30 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
26d40 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
26d50 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
26d60 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
26d70 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
26d80 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
26d90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
26da0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
26db0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26dc0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
26dd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
26de0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
26df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26e00 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
26e10 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
26e20 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
26e30 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
26e60 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
26e70 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26e80 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26e90 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
26ea0 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
26eb0 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20  ufStart = pBuf; 
26ec0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
26ed0 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66  original out buf
26ee0 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  fer */.#endif.. 
26ef0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
26f00 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ;.  assert( eOp=
26f10 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a  =0 || eOp==1 );.
26f20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26f30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
26f40 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
26f50 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
26f60 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
26f70 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26f80 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
26f90 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
26fa0 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
26fb0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
26fc0 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28  yload;.  assert(
26fd0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
26fe0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
26ff0 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad );..  assert(
27000 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67   aPayload > pPag
27010 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66  e->aData );.  if
27020 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61  ( (uptr)(aPayloa
27030 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d - pPage->aData
27040 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  ) > (pBt->usable
27050 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66  Size - pCur->inf
27060 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  o.nLocal) ){.   
27070 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
27080 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
27090 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
270a0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
270b0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f  .  The.    ** co
270c0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20  nditional above 
270d0 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a  is really:.    *
270e0 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70  *    &aPayload[p
270f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27100 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
27110 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
27120 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73  e].    ** but is
27130 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73   recast into its
27140 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f   current form to
27150 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f   avoid integer o
27160 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73  verflow problems
27170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
27180 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27190 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
271a0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
271b0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
271c0 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
271d0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
271e0 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
271f0 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
27200 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
27210 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
27220 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
27230 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
27240 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
27250 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
27260 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
27270 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
27280 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
27290 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
272a0 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
272b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
272c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
272d0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
272e0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
272f0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
27300 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
27310 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
27320 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
27330 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
27340 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
27350 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
27360 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
27370 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
27380 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
27390 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
273a0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
273b0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
273c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
273d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
273e0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
273f0 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
27400 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
27410 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
27420 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
27430 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
27440 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
27450 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
27460 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
27470 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
27480 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
27490 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
274a0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
274b0 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
274c0 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
274d0 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
274e0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
274f0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
27500 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
27510 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
27520 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
27530 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
27540 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
27550 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
27560 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27570 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
27580 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
27590 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
275a0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
275b0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
275c0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
275d0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
275e0 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20 7c  flow==0.       |
275f0 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69 7a  | nOvfl*(int)siz
27600 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69  eof(Pgno) > sqli
27610 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43  te3MallocSize(pC
27620 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20  ur->aOverflow). 
27630 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27640 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
27650 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
27660 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
27670 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
27680 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
27690 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
276a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
276b0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
276c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
276d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
276e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
276f0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
27700 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
27710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27720 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
27730 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
27740 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
27750 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
27760 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
27770 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
27780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
27790 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
277a0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
277b0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
277c0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
277d0 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
277e0 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
277f0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
27800 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
27810 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
27820 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
27830 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
27840 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
27850 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
27860 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
27870 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
27880 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
27890 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
278a0 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
278b0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
278c0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
278d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
278e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
278f0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27900 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
27910 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
27920 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
27930 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
27940 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27950 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
27960 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27970 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
27980 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
27990 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
279a0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
279b0 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
279c0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
279d0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
279e0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
279f0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
27a00 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
27a10 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
27a20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
27a30 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
27a40 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
27a50 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
27a60 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
27a70 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
27a80 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
27a90 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
27aa0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
27ab0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
27ac0 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
27ad0 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
27ae0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
27af0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
27b00 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
27b10 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
27b20 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
27b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
27b40 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
27b50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27b60 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
27b70 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
27b80 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
27b90 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
27ba0 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
27bb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
27bc0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27bd0 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
27be0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
27bf0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27c00 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
27c10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
27c20 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
27c30 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
27c40 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
27c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27c60 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
27c70 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
27c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
27c90 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
27ca0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
27cb0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
27cc0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
27cd0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
27ce0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
27cf0 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
27d00 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
27d10 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
27d20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27d30 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27d40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27d50 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
27d60 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69  /* File from whi
27d70 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74 20  ch to do direct 
27d80 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f  overflow read */
27d90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
27da0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
27db0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
27dc0 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
27dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
27de0 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
27df0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
27e00 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27e10 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27e20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
27e30 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
27e40 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
27e50 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
27e60 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
27e70 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
27e80 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
27e90 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
27ea0 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
27eb0 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
27ec0 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
27ed0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
27ee0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
27ef0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
27f00 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
27f10 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61  **   4) the data
27f20 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
27f30 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
27f40 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67   **   5) the pag
27f50 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
27f60 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  WAL file.       
27f70 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73   **   6) at leas
27f80 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
27f90 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
27fa0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
27fb0 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
27fc0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
27fd0 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
27fe0 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
27ff0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
28000 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
28010 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
28020 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
28030 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
28040 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
28050 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
28060 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
28070 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
28080 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
28090 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
280a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
280b0 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
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 20 20 20 20 20 20 20 20                  
280e0 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
280f0 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
28100 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28130 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
28140 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
28150 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
28160 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
28170 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
28180 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
28190 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
281a0 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
281b0 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
281c0 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
281d0 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
281e0 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42 74  3PagerUseWal(pBt
281f0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
28200 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35 29  ge)       /* (5)
28210 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
28220 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
28230 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28250 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
28260 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
28270 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
28280 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
28290 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
282a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
282b0 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
282c0 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f  /* due to (6) */
282f0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28300 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
28310 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
28320 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
28330 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
28340 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
28350 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
28360 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
28370 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
28380 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
28390 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
283a0 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
283b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
283c0 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
283d0 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
283e0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
283f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28400 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
28410 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
28420 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
28430 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30           (eOp==0
28440 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
28450 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
28460 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28490 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
284a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
284b0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
284c0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
284d0 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
284e0 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
284f0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
28500 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
28510 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
28520 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
28530 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28540 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
28550 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28560 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
28570 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
28590 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
285a0 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65   if( amt==0 ) re
285b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
285c0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
285d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
285e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
285f0 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  iIdx++;.    }.  
28600 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
28610 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
28620 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c  ){.    /* Overfl
28630 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72  ow chain ends pr
28640 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20  ematurely */.   
28650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
28660 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
28670 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
28680 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
28690 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  ad part of the p
286a0 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72  ayload for the r
286b0 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74  ow at which that
286c0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
286d0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
286e0 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79  nting.  "amt" by
286f0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
28700 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75  sferred into pBu
28710 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
28720 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
28730 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
28740 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e  pCur can be poin
28750 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61  ting to either a
28760 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64   table or an ind
28770 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66  ex b-tree..** If
28780 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
28790 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e  able btree, then
287a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63   the content sec
287b0 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49  tion is read.  I
287c0 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69  f.** pCur is poi
287d0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  nting to an inde
287e0 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68  x b-tree then th
287f0 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73  e key section is
28800 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   read..**.** For
28810 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28820 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c  load(), the call
28830 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
28840 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
28850 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
28860 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61  id row in the ta
28870 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65  ble.  For sqlite
28880 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
28890 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63  cked(), the.** c
288a0 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69  ursor might be i
288b0 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20  nvalid or might 
288c0 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f  need to be resto
288d0 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
288e0 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   read..**.** Ret
288f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
28900 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
28910 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
28920 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
28930 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
28940 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
28950 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
28960 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
28970 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
28980 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
28990 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42  e3BtreePayload(B
289a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
289b0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
289c0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
289d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
289e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
289f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28a00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28a10 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28a20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
28a30 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ge>=0 && pCur->p
28a40 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
28a50 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
28a60 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
28a70 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
28a80 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
28a90 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
28aa0 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
28ab0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
28ac0 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71  is variant of sq
28ad0 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28ae0 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69  d() works even i
28af0 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
28b00 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43   not.** in the C
28b10 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74  URSOR_VALID stat
28b20 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  e.  It is only u
28b30 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  sed by the sqlit
28b40 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a  e3_blob_read().*
28b50 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  * interface..*/.
28b60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28b70 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61  MIT_INCRBLOB.sta
28b80 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
28b90 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50 61  INE int accessPa
28ba0 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20  yloadChecked(.  
28bb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a  BtCursor *pCur,.
28bc0 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20    u32 offset,.  
28bd0 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20  u32 amt,.  void 
28be0 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72  *pBuf.){.  int r
28bf0 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  c;.  if ( pCur->
28c00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
28c10 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
28c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
28c30 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
28c40 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28c50 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72  red(pCur) );.  r
28c60 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65  c = btreeRestore
28c70 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
28c80 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
28c90 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50  c ? rc : accessP
28ca0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
28cb0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
28cc0 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
28cd0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
28ce0 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  cked(BtCursor *p
28cf0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
28d00 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
28d10 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75  pBuf){.  if( pCu
28d20 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28d30 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
28d40 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28d50 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28d60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63  );.    return ac
28d70 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
28d80 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
28d90 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  Buf, 0);.  }else
28da0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63  {.    return acc
28db0 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  essPayloadChecke
28dc0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
28dd0 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a  amt, pBuf);.  }.
28de0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
28df0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
28e00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
28e10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
28e20 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
28e30 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
28e40 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
28e50 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
28e60 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
28e70 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
28e80 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
28e90 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64  * the key if ind
28ea0 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65  ex btrees (pPage
28eb0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64  ->intKey==0) and
28ec0 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72   is the data for
28ed0 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73  .** table btrees
28ee0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
28ef0 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  =1). The number 
28f00 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
28f10 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74  lable.** key/dat
28f20 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  a is written int
28f30 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
28f40 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
28f50 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65  value.** returne
28f60 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20  d will not be a 
28f70 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
28f80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28f90 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
28fa0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
28fb0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
28fc0 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
28fd0 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
28fe0 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
28ff0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
29000 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
29010 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
29020 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
29030 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
29040 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
29050 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
29060 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
29070 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
29080 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
29090 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
290a0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
290b0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
290c0 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
290d0 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
290e0 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
290f0 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
29100 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
29110 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
29120 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
29130 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
29140 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
29150 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
29160 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
29170 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
29180 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
29190 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
291a0 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
291b0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
291c0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
291d0 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68  onst void *fetch
291e0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
291f0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
29200 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
29210 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
29220 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
29230 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20  2 *pAmt         
29240 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
29250 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
29260 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
29270 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a  /.){.  int amt;.
29280 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
29290 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
292a0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
292b0 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge);.  assert( p
292c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
292d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
292e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
292f0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
29300 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
29310 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
29320 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29330 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
29340 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
29350 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
29360 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
29370 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
29380 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
29390 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
293a0 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad>pCur->pPage->
293b0 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54  aData || CORRUPT
293c0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
293d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
293e0 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65  load<pCur->pPage
293f0 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
29400 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
29410 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
29420 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28  cal;.  if( amt>(
29430 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65  int)(pCur->pPage
29440 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75  ->aDataEnd - pCu
29450 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
29460 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  ) ){.    /* Ther
29470 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20  e is too little 
29480 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
29490 65 20 66 6f 72 20 74 68 65 20 65 78 70 65 63 74  e for the expect
294a0 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a  ed amount.    **
294b0 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e   of local conten
294c0 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73 74  t. Database must
294d0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
294e0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
294f0 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d  UPT_DB );.    am
29500 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29  t = MAX(0, (int)
29510 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  (pCur->pPage->aD
29520 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
29530 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a  nfo.pPayload));.
29540 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75    }.  *pAmt = (u
29550 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e  32)amt;.  return
29560 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
29570 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
29580 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
29590 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
295a0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
295b0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
295c0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
295d0 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
295e0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
295f0 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
29600 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
29610 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
29620 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
29630 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
29640 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
29650 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
29660 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
29670 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
29680 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
29690 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
296a0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
296b0 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
296c0 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
296d0 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
296e0 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
296f0 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
29700 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
29710 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
29720 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
29730 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
29740 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
29750 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
29760 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
29770 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
29780 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
29790 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
297a0 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
297b0 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
297c0 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
297d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
297e0 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f  oadFetch(BtCurso
297f0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
29800 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
29810 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
29820 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pAmt);.}.../*.*
29830 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
29840 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
29850 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
29860 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
29870 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
29880 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
29890 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
298a0 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
298b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
298c0 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
298d0 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
298e0 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
298f0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
29900 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
29910 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
29920 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
29930 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
29940 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
29950 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
29960 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
29970 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
29980 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
29990 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
299a0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
299b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
299c0 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53   newPgno){.  BtS
299d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
299e0 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
299f0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29a00 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29a10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29a20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29a30 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
29a40 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
29a50 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
29a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29a70 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
29a80 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
29a90 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
29aa0 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
29ab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
29ac0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
29ad0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
29ae0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
29af0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
29b00 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
29b10 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
29b20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29b30 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
29b40 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50  >ix;.  pCur->apP
29b50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29b60 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
29b70 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a    pCur->ix = 0;.
29b80 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
29b90 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64  .  return getAnd
29ba0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
29bb0 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50  wPgno, &pCur->pP
29bc0 61 67 65 2c 20 70 43 75 72 2c 20 70 43 75 72 2d  age, pCur, pCur-
29bd0 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
29be0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
29bf0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
29c00 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
29c10 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
29c20 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
29c30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
29c40 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
29c50 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
29c60 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
29c70 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
29c80 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
29c90 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
29ca0 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
29cb0 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
29cc0 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
29cd0 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
29ce0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
29cf0 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
29d00 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
29d10 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
29d20 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
29d30 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
29d40 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
29d50 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
29d60 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
29d70 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
29d80 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
29d90 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
29da0 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
29dd0 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
29de0 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
29df0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
29e00 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
29e10 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
29e20 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
29e30 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
29e40 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
29e50 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
29e60 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
29e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
29e80 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
29e90 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
29ea0 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
29eb0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
29ec0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
29ed0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
29ee0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
29ef0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
29f00 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
29f10 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
29f20 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
29f30 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
29f40 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
29f50 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
29f60 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
29f70 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
29f80 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
29f90 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
29fa0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
29fb0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
29fc0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
29fd0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
29fe0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
29ff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a000 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
2a010 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2a020 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b   MemPage *pLeaf;
2a030 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a040 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2a050 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a060 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a070 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a080 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2a090 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
2a0a0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
2a0b0 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
2a0c0 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
2a0d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a0e0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
2a0f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a100 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
2a110 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  Cur->pPage->pgno
2a120 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
2a130 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2a140 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
2a150 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a160 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
2a170 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
2a180 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2a190 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a1a0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2a1b0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2a1c0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  );.  pCur->ix = 
2a1d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a1e0 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c  ->iPage-1];.  pL
2a1f0 65 61 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  eaf = pCur->pPag
2a200 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65  e;.  pCur->pPage
2a210 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2a220 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  --pCur->iPage];.
2a230 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
2a240 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a  Null(pLeaf);.}..
2a250 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2a260 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
2a270 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2a280 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
2a290 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
2a2a0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
2a2b0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
2a2c0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
2a2d0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
2a2e0 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
2a2f0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2a300 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
2a310 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
2a320 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
2a330 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
2a340 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
2a350 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
2a360 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
2a370 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
2a380 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
2a390 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
2a3a0 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
2a3b0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
2a3c0 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
2a3d0 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
2a3e0 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
2a3f0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
2a400 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
2a410 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20  SOR_INVALID and 
2a420 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2a430 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54  urns SQLITE_EMPT
2a440 59 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  Y. Otherwise,.**
2a450 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
2a460 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
2a470 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f  he first cell lo
2a480 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  cated on the roo
2a490 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c  t.** (or virtual
2a4a0 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
2a4b0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2a4c0 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
2a4d0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49  R_VALID..**.** I
2a4e0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2a4f0 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
2a500 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20  ully, it may be 
2a510 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
2a520 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20  .** page-header 
2a530 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74  flags indicate t
2a540 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c  hat the [virtual
2a550 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74  ] root-page is t
2a560 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
2a570 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70  kind of b-tree p
2a580 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65  age (i.e. if whe
2a590 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75  n opening the cu
2a5a0 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20  rsor the caller 
2a5b0 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69  did not.** speci
2a5c0 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  fy a KeyInfo str
2a5d0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
2a5e0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
2a5f0 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a  0x05 or 0x0D,.**
2a600 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61   indicating a ta
2a610 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69  ble b-tree, or i
2a620 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  f the caller did
2a630 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
2a640 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
2a650 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2a660 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f  is set to 0x02 o
2a670 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69  r 0x0A, indicati
2a680 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62  ng an index.** b
2a690 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  -tree)..*/.stati
2a6a0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
2a6b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a6c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
2a6d0 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
2a6e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2a6f0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2a700 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2a710 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2a720 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
2a730 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2a740 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2a750 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
2a760 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2a780 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
2a790 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2a7a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a7b0 75 72 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52  ur->eState < CUR
2a7c0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a7d0 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30  || pCur->iPage<0
2a7e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a7f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c  ur->pgnoRoot>0 |
2a800 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20  | pCur->iPage<0 
2a810 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
2a820 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
2a830 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  if( pCur->iPage 
2a840 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2a850 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
2a860 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->pPage);.      
2a870 77 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69  while( --pCur->i
2a880 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2a890 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2a8a0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
2a8b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
2a8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2a8d0 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2a8e0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20  >apPage[0];.    
2a8f0 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74    goto skip_init
2a900 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2a910 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
2a920 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
2a930 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a940 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2a950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d  return SQLITE_EM
2a960 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  PTY;.  }else{.  
2a970 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a980 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
2a990 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2a9a0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
2a9b0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20  IRESEEK ){.     
2a9c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2a9d0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2a9e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2a9f0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2aa00 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
2aa10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2aa20 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
2aa30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2aa40 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
2aa50 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
2aa60 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
2aa70 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
2aa80 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
2aa90 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
2aaa0 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20  ur->pPage,.     
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aac0 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
2aad0 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
2aae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2aaf0 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
2ab00 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2ab10 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2ab20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ab30 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
2ab40 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
2ab50 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
2ab60 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b  ->pPage->intKey;
2ab70 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
2ab80 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2ab90 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
2aba0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
2abb0 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
2abc0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
2abd0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
2abe0 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
2abf0 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
2ac00 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
2ac10 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
2ac20 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
2ac30 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
2ac40 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
2ac50 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
2ac60 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
2ac70 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
2ac80 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
2ac90 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
2aca0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
2acb0 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
2acc0 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
2acd0 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
2ace0 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
2acf0 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
2ad00 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
2ad10 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
2ad20 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
2ad30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
2ad40 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
2ad50 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
2ad60 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
2ad70 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
2ad80 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2ad90 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
2ada0 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
2adb0 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
2adc0 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
2add0 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
2ade0 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
2adf0 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
2ae00 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
2ae10 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
2ae20 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
2ae30 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
2ae40 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
2ae50 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
2ae60 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
2ae70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ae80 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 43  _CORRUPT_PAGE(pC
2ae90 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ur->pPage);.  }.
2aea0 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20  .skip_init:  .  
2aeb0 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
2aec0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2aed0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2aee0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2aef0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2af00 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2af10 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74  dOvfl);..  pRoot
2af20 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2af30 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
2af40 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ll>0 ){.    pCur
2af50 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2af60 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
2af70 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61   if( !pRoot->lea
2af80 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
2af90 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
2afa0 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
2afb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2afc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2afd0 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
2afe0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
2aff0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
2b000 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
2b010 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2b020 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
2b030 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2b040 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
2b050 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
2b060 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2b070 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  INVALID;.    rc 
2b080 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
2b090 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b0a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2b0b0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2b0c0 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
2b0d0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2b0e0 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
2b0f0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2b100 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2b110 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
2b120 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
2b130 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2b140 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
2b150 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
2b160 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2b170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b180 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
2b190 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b1a0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2b1b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b1c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b1d0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2b1e0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b1f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b200 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2b210 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2b220 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
2b230 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
2b240 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2b250 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
2b260 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2b270 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2b280 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2b290 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2b2a0 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b  age, pCur->ix));
2b2b0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2b2c0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2b2d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b2e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2b2f0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2b300 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
2b310 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2b320 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
2b330 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
2b340 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2b350 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
2b360 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
2b370 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
2b380 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
2b390 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
2b3a0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b3b0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
2b3c0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
2b3d0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
2b3e0 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
2b3f0 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
2b400 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
2b410 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2b420 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
2b430 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
2b440 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
2b450 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
2b460 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
2b470 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
2b480 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2b490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b4a0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
2b4b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2b4c0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2b4d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b4e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2b4f0 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
2b500 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2b510 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2b520 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2b530 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2b540 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2b550 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2b560 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
2b570 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2b580 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2b590 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2b5a0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2b5b0 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2b5c0 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
2b5d0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2b5e0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
2b5f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b600 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20   }.  pCur->ix = 
2b610 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2b620 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b630 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2b640 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2b650 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2b660 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
2b670 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2b680 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
2b690 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2b6a0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2b6b0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2b6c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2b6d0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2b6e0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2b6f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2b700 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2b710 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2b720 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2b730 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2b740 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2b750 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
2b760 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2b770 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2b780 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2b790 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2b7a0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2b7b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b7c0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2b7d0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2b7e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
2b7f0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2b800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b810 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2b820 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
2b830 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52  ell>0 );.    *pR
2b840 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  es = 0;.    rc =
2b850 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b860 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  pCur);.  }else i
2b870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2b880 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PTY ){.    asser
2b890 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2b8a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2b8b0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2b8c0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
2b8d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b8e0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2b8f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2b900 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2b910 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2b920 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2b930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
2b940 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
2b950 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
2b960 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
2b970 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
2b980 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
2b990 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
2b9a0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2b9b0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2b9c0 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
2b9d0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2b9e0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2b9f0 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
2ba00 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2ba10 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ba20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2ba30 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2ba40 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2ba50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2ba60 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
2ba70 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
2ba80 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
2ba90 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
2baa0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
2bab0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
2bac0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2bad0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2bae0 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
2baf0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
2bb00 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
2bb10 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
2bb20 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
2bb30 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
2bb40 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
2bb50 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2bb60 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
2bb70 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
2bb80 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
2bb90 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
2bba0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2bbb0 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
2bbc0 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
2bbd0 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
2bbe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2bbf0 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  x==pCur->pPage->
2bc00 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
2bc10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2bc20 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  ge->leaf );.#end
2bc30 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
2bc40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2bc50 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2bc60 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2bc70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bc80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bc90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2bca0 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65  ALID );.    *pRe
2bcb0 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
2bcc0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2bcd0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2bce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bcf0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2bd00 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2bd10 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ast;.    }else{.
2bd20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2bd30 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
2bd40 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Last;.    }.  }e
2bd50 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2bd60 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
2bd70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2bd80 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2bd90 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2bda0 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
2bdb0 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
2bdc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
2bdd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2bde0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2bdf0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2be00 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2be10 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2be20 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2be30 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2be40 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2be50 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2be60 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2be70 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2be80 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2be90 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2bea0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2beb0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2bec0 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2bed0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2bee0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2bef0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2bf00 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2bf10 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2bf20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2bf30 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2bf40 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2bf50 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2bf60 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2bf70 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2bf80 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2bf90 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2bfa0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2bfb0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2bfc0 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2bfd0 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2bfe0 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2bff0 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2c000 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2c010 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2c020 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2c030 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2c040 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2c050 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2c060 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2c070 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2c080 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2c090 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2c0a0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2c0b0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2c0c0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2c0d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2c0e0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2c0f0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2c100 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2c110 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c130 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2c140 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2c150 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2c160 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2c170 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2c180 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2c190 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2c1a0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2c1b0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2c1c0 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2c1d0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2c1e0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2c1f0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2c200 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2c210 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2c220 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2c230 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2c240 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2c250 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2c260 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2c270 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2c280 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2c290 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2c2a0 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2c2b0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2c2c0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2c2d0 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2c2e0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2c2f0 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2c300 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2c310 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2c320 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2c330 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2c340 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2c350 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2c360 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2c370 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2c380 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2c390 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2c3a0 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2c3b0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2c3c0 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2c3d0 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2c3e0 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2c400 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2c410 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2c420 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2c430 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2c440 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2c450 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c460 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c470 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c480 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2c490 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2c4a0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2c4b0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2c4c0 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2c4d0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2c4e0 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  fo==0) );.  asse
2c4f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c500 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2c510 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  | (pIdxKey==0)==
2c520 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  (pCur->curIntKey
2c530 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  !=0) );..  /* If
2c540 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2c550 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2c560 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2c570 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2c580 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2c590 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2c5a0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2c5b0 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2c5c0 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20  IdxKey==0.   && 
2c5d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c5e0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2c5f0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2c600 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2c610 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  =0.  ){.    if( 
2c620 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2c630 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2c640 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2c650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c660 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2c670 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2c680 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2c690 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2c6a0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2c6b0 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ast)!=0 ){.     
2c6c0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2c6d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c6e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2c6f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2c700 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69   requested key i
2c710 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  s one more than 
2c720 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79  the previous key
2c730 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
2c740 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65  try to get there
2c750 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74   using sqlite3Bt
2c760 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72  reeNext() rather
2c770 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20   than a full.   
2c780 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61     ** binary sea
2c790 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rch.  This is an
2c7a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
2c7b0 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74  ly.  The correct
2c7c0 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a   answer.      **
2c7d0 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e   is still obtain
2c7e0 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ed without this 
2c7f0 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74  case, only a lit
2c800 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79  tle more slowely
2c810 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2c820 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d  ur->info.nKey+1=
2c830 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72  =intKey && !pCur
2c840 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2c850 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2c860 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2c870 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2c880 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
2c890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c8a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c8b0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
2c8c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c8d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2c8e0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2c8f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2c900 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2c920 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2c930 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
2c940 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c950 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
2c960 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2c970 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2c980 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c990 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2c9a0 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2c9b0 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2c9c0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2c9d0 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2c9e0 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2c9f0 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2ca00 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2ca10 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2ca20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2ca30 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2ca40 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2ca50 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2ca60 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2ca70 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2ca80 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2ca90 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2caa0 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2cab0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2cac0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2cad0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2cae0 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2caf0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2cb00 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2cb10 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2cb20 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2cb30 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2cb40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cb50 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
2cb60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2cb70 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2cb80 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2cb90 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
2cba0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2cbb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cbc0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2cbd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2cbe0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29  age->nCell > 0 )
2cbf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2cc00 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43  ->iPage==0 || pC
2cc10 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2cc20 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2cc30 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2cc40 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2cc50 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2cc60 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2cc70 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2cc80 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2cc90 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2cca0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2ccb0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38  r->pPage;.    u8
2ccc0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cce0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2ccf0 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
2cd00 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
2cd10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
2cd20 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
2cd30 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
2cd40 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
2cd50 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
2cd60 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
2cd70 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
2cd80 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
2cd90 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
2cda0 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
2cdb0 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
2cdc0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
2cdd0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
2cde0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
2cdf0 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
2ce00 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
2ce10 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
2ce20 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
2ce30 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
2ce40 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
2ce50 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
2ce60 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2ce70 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
2ce80 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
2ce90 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
2cea0 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
2ceb0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2cec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ced0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2cee0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2cef0 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
2cf00 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
2cf10 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
2cf20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2cf30 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
2cf40 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
2cf50 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
2cf60 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
2cf70 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
2cf80 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
2cf90 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
2cfa0 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
2cfb0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2cfc0 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
2cfd0 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
2cfe0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2cff0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
2d000 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2d010 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2d020 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2d030 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2d040 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
2d050 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2d060 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
2d070 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2d080 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2d090 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a  ge->aDataEnd ){.
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2d0b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d0c0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
2d0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d0e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d0f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2d100 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2d110 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2d120 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2d130 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2d140 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2d150 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2d160 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2d170 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2d180 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2d190 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2d1a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2d1b0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2d1c0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2d1d0 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2d1e0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2d1f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2d200 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2d210 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2d220 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2d230 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2d240 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2d250 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2d260 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2d270 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2d280 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2d290 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2d2a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d2b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2d2c0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
2d2d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2d2e0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2d2f0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2d300 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2d310 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2d320 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2d330 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2d340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2d370 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2d380 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2d390 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2d3a0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2d3b0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2d3c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2d3d0 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2d3e0 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2d3f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2d400 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2d410 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2d420 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2d430 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2d440 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2d450 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2d460 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2d470 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2d480 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2d490 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
2d4a0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2d4b0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
2d4c0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
2d4d0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
2d4e0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
2d4f0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
2d500 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
2d510 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
2d520 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
2d530 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
2d540 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
2d550 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
2d560 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
2d570 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
2d580 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
2d590 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
2d5a0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
2d5b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
2d5c0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
2d5d0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
2d5e0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
2d5f0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
2d600 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
2d610 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
2d620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d630 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
2d640 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2d650 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
2d660 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
2d670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
2d680 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
2d690 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
2d6a0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
2d6b0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
2d6c0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
2d6d0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2d6e0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
2d6f0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
2d700 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
2d710 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2d720 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d730 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
2d740 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2d750 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2d760 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2d770 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2d780 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
2d790 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2d7a0 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
2d7b0 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
2d7c0 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
2d7d0 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
2d7e0 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
2d7f0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
2d800 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d810 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2d820 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
2d830 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
2d840 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
2d850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
2d860 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2d870 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
2d880 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2d890 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2d8a0 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
2d8b0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2d8c0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2d8d0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2d8e0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2d8f0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
2d900 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2d920 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
2d930 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
2d940 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2d950 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
2d960 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
2d970 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
2d980 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
2d990 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
2d9a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
2d9b0 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
2d9c0 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
2d9d0 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
2d9e0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
2d9f0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
2da00 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
2da10 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
2da20 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
2da30 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2da40 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
2da50 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
2da60 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
2da70 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
2da80 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
2da90 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
2daa0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2dab0 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
2dac0 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
2dad0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
2dae0 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
2daf0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2db00 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
2db10 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
2db20 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
2db30 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
2db40 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
2db50 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
2db60 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
2db70 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
2db80 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
2db90 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
2dba0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2dbb0 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
2dbc0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
2dbd0 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
2dbe0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
2dbf0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2dc00 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
2dc10 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
2dc20 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
2dc30 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
2dc40 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2dc50 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
2dc60 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2dc70 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
2dc80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2dc90 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
2dca0 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2dcb0 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2dcc0 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
2dcd0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2dce0 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
2dcf0 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
2dd00 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
2dd10 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
2dd20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dd30 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2dd40 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
2dd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2dd60 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2dd70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dd80 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2dd90 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2dda0 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2ddb0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2ddc0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2ddd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2dde0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2ddf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2de00 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2de10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2de30 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2de40 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2de50 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2de60 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2de70 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2de80 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  0);.          pC
2de90 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2dea0 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b  ~BTCF_ValidOvfl;
2deb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2dec0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2ded0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2dee0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2def0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2df00 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2df10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2df20 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2df30 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2df40 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2df50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2df60 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2df70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2df80 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2df90 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2dfa0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2dfb0 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2dfc0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2dfd0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2dfe0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2dff0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2e000 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2e010 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2e020 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2e030 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2e040 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2e050 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2e060 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2e070 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2e080 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2e090 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2e0a0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2e0b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2e0c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e0d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2e0e0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2e0f0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2e100 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2e110 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2e120 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2e130 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2e140 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
2e150 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2e160 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
2e170 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2e180 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2e190 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2e1a0 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2e1b0 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20  (lwr+upr)/2 */. 
2e1c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e1d0 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
2e1e0 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
2e1f0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2e200 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
2e210 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e220 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
2e230 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e240 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2e250 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
2e260 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
2e270 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2e280 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
2e290 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
2e2a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e2b0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2e2c0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
2e2d0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
2e2e0 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
2e2f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2e300 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2e310 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2e320 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2e330 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
2e340 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
2e350 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2e360 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
2e370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
2e380 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72  r->ix = (u16)lwr
2e390 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2e3a0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
2e3b0 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
2e3c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
2e3d0 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
2e3e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2e3f0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28  = 0;.  assert( (
2e400 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e410 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2e420 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2e430 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2e440 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2e450 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2e460 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2e470 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2e480 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2e490 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2e4a0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2e4b0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2e4c0 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2e4d0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2e4e0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2e4f0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2e500 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2e510 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2e520 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2e530 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2e540 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2e550 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e560 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2e570 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2e580 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2e590 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2e5a0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2e5b0 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2e5c0 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2e5d0 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2e5e0 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2e5f0 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2e600 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2e610 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2e620 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2e630 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2e640 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2e650 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2e660 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ate);.}../*.** R
2e670 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74  eturn an estimat
2e680 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  e for the number
2e690 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
2e6a0 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72 20  table that pCur 
2e6b0 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  is.** pointing t
2e6c0 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  o.  Return a neg
2e6d0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2e6e0 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  no estimate is c
2e6f0 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61  urrently .** ava
2e700 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73  ilable..*/.i64 s
2e710 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f  qlite3BtreeRowCo
2e720 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72 20  untEst(BtCursor 
2e730 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b  *pCur){.  i64 n;
2e740 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65  .  u8 i;..  asse
2e750 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2e760 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2e770 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e780 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2e790 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2e7a0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  utex) );..  /* C
2e7b0 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e  urrently this in
2e7c0 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20  terface is only 
2e7d0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50  called by the OP
2e7e0 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20  _IfSmaller.  ** 
2e7f0 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74  opcode, and it t
2e800 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75 72  hat case the cur
2e810 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  sor will always 
2e820 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a  be valid and.  *
2e830 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f  * will always po
2e840 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f  int to a leaf no
2e850 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  de. */.  if( NEV
2e860 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21  ER(pCur->eState!
2e870 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
2e880 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66   return -1;.  if
2e890 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70 50  ( NEVER(pCur->pP
2e8a0 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20  age->leaf==0) ) 
2e8b0 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20  return -1;..  n 
2e8c0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  = pCur->pPage->n
2e8d0 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Cell;.  for(i=0;
2e8e0 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   i<pCur->iPage; 
2e8f0 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70  i++){.    n *= p
2e900 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
2e910 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  nCell;.  }.  ret
2e920 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
2e930 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
2e940 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
2e950 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2e960 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e  base. .** Return
2e970 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   value:.**.**   
2e980 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
2e990 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
2e9a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20 20  SQLITE_DONE     
2e9b0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2e9c0 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  dy pointing at t
2e9d0 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a  he last element.
2e9e0 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  **    otherwise 
2e9f0 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64         some kind
2ea00 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
2ea10 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
2ea20 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2ea30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2ea40 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  t().  That routi
2ea50 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2ea60 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2ea70 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2ea80 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2ea90 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2eaa0 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2eab0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c   to the next cel
2eac0 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2ead0 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2eae0 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29  wer) btreeNext()
2eaf0 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69   helper.** routi
2eb00 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2eb10 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2eb20 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2eb30 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72  ifferent page or
2eb40 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
2eb50 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2eb60 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
2eb70 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69  the F argument i
2eb80 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2eb90 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  xt(C,F) is 1, th
2eba0 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  en the.** cursor
2ebb0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2ebc0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2ebd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2ebe0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
2ebf0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
2ec00 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2ec10 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
2ec20 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
2ec30 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74 20  nt.** is a hint 
2ec40 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
2ec50 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  .  SQLite btree 
2ec60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2ec70 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74  oes not use.** t
2ec80 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
2ec90 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
2eca0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2ecb0 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2ecc0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2ecd0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
2ece0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2ecf0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2ed00 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2ed10 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2ed20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ed30 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2ed40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2ed50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2ed60 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ed70 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ed80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
2ed90 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2eda0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2edb0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2edc0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2edd0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2ede0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2edf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2ee00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2ee10 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2ee20 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2ee30 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2ee40 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2ee50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2ee60 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2ee70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2ee80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ee90 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2eea0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2eeb0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2eec0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2eed0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2eee0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2eef0 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2ef00 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2ef10 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2ef20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ef30 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2ef40 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2ef50 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2ef60 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2ef70 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b  pPage;.  idx = +
2ef80 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 61 73 73  +pCur->ix;.  ass
2ef90 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2efa0 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  it );..  /* If t
2efb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2efc0 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
2efd0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
2efe0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
2eff0 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
2f000 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
2f010 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
2f020 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
2f030 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
2f040 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
2f050 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
2f060 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
2f070 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
2f080 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
2f090 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
2f0a0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
2f0b0 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
2f0c0 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
2f0d0 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
2f0e0 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
2f0f0 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
2f100 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
2f110 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
2f120 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
2f130 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
2f140 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2f150 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
2f160 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2f170 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2f180 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2f190 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
2f1a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2f1b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
2f1c0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2f1d0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2f1e0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
2f1f0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2f200 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2f210 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2f220 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2f230 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f240 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
2f250 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2f260 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2f270 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2f280 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ge;.    }while( 
2f290 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d  pCur->ix>=pPage-
2f2a0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
2f2b0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2f2c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f2d0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2f2e0 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
2f2f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2f300 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f310 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2f320 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f340 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2f350 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2f360 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2f370 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2f380 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2f390 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67   *pCur, int flag
2f3a0 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2f3b0 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Page;.  UNUSED_P
2f3c0 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20  ARAMETER( flags 
2f3d0 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43  );  /* Used in C
2f3e0 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61  OMDB2 but not na
2f3f0 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20  tive SQLite */. 
2f400 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2f410 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2f420 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
2f430 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
2f440 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2f450 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2f460 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2f470 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f480 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2f490 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2f4a0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2f4b0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2f4c0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2f4d0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2f4e0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f4f0 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2f500 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70  eNext(pCur);.  p
2f510 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2f520 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  ge;.  if( (++pCu
2f530 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e  r->ix)>=pPage->n
2f540 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
2f550 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75  ->ix--;.    retu
2f560 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2f570 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
2f580 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f5a0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2f5b0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2f5c0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2f5d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
2f5e0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2f5f0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
2f600 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
2f610 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
2f620 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a  Return values:.*
2f630 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
2f640 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a  OK     success.*
2f650 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  *     SQLITE_DON
2f660 45 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69  E   the cursor i
2f670 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65  s already on the
2f680 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
2f690 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  f the table.**  
2f6a0 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2f6b0 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
2f6c0 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
2f6d0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2f6e0 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2f6f0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2f700 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2f710 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2f720 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2f730 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64  case of merely d
2f740 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ecrementing the 
2f750 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2f760 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2f770 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  o the previous c
2f780 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
2f790 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
2f7a0 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76  lower) btreePrev
2f7b0 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72  ious().** helper
2f7c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f7d0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2f7e0 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2f7f0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2f800 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73  age.** or to res
2f810 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2f820 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
2f830 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
2f840 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42  ment to sqlite3B
2f850 74 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46  treePrevious(C,F
2f860 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20  ) is 1, then.** 
2f870 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65  the cursor corre
2f880 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2f890 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
2f8a0 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2f8b0 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
2f8c0 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
2f8d0 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
2f8e0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
2f8f0 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e F argument is 
2f900 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65  a.** hint to the
2f910 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65   implement.  The
2f920 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62   native SQLite b
2f930 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2f940 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ion does not.** 
2f950 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62  use this hint, b
2f960 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
2f970 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2f980 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2f990 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2f9a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2f9b0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2f9c0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2f9d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2f9e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2f9f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fa00 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2fa10 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2fa20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2fa30 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2fa40 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
2fa50 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2fa60 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2fa70 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
2fa80 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2fa90 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
2faa0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2fab0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2fac0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2fad0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2fae0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2faf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fb00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2fb10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2fb20 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2fb30 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2fb40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fb50 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
2fb60 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2fb70 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2fb80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2fb90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2fba0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2fbb0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2fbc0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2fbd0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2fbe0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2fbf0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2fc00 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t<0 ){.        p
2fc10 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2fc20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2fc30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2fc40 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2fc50 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2fc60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2fc70 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2fc80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2fc90 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2fca0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2fcb0 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2fcc0 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63  pCur->ix;.    rc
2fcd0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2fce0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
2fcf0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2fd00 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
2fd10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2fd20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
2fd30 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
2fd40 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
2fd50 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b  ( pCur->ix==0 ){
2fd60 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2fd70 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2fd80 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2fd90 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2fda0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2fdb0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
2fdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2fdd0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2fde0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2fdf0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2fe00 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2fe10 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2fe20 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2fe30 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
2fe40 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  ..    pCur->ix--
2fe50 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
2fe60 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69  ur->pPage;.    i
2fe70 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2fe80 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2fe90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2fea0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2feb0 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ous(pCur, 0);.  
2fec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2fed0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2fee0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2fef0 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
2ff00 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2ff10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2ff20 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
2ff30 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ff40 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ff50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
2ff60 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
2ff70 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2ff80 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2ff90 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2ffa0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2ffb0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2ffc0 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20  ETER( flags );  
2ffd0 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42  /* Used in COMDB
2ffe0 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65  2 but not native
2fff0 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75   SQLite */.  pCu
30000 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
30010 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
30020 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
30030 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
30040 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
30050 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
30060 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
30070 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
30080 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  ->ix==0.   || pC
30090 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d  ur->pPage->leaf=
300a0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
300b0 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
300c0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43  (pCur);.  }.  pC
300d0 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75  ur->ix--;.  retu
300e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
300f0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
30100 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
30110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30120 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
30130 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
30140 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
30150 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
30160 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
30170 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
30180 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
30190 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
301a0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
301b0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
301c0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
301d0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
301e0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
301f0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
30200 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
30210 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
30220 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
30230 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
30240 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
30250 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
30260 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
30270 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
30280 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
30290 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
302a0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
302b0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
302c0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
302d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
302e0 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
302f0 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
30300 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
30310 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
30320 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
30330 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
30340 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
30350 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
30360 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
30370 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
30380 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30390 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
303a0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
303b0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
303c0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
303d0 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
303e0 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
303f0 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
30400 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
30410 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
30420 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
30430 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
30440 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
30450 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
30460 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
30470 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
30480 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
30490 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
304a0 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
304b0 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
304c0 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
304d0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
304e0 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
304f0 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
30500 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
30510 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
30520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
30530 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
30540 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
30550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30560 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
30570 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
30580 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
30590 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
305a0 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
305b0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
305c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
305d0 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
305e0 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
305f0 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
30600 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
30610 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
30620 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
30630 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
30640 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
30650 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
30660 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
30670 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
30680 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
30690 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
306a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
306b0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
306c0 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
306d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
306e0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
306f0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
30700 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
30710 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
30720 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
30730 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
30740 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
30750 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
30760 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
30770 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
30780 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30790 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
307a0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
307b0 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
307c0 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
307d0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
307e0 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
307f0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
30800 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
30810 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
30820 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
30830 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
30840 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
30850 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
30860 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
30870 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
30880 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
30890 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
308a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
308b0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
308c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
308d0 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
308e0 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
308f0 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
30900 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
30910 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
30920 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
30930 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
30940 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
30950 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
30960 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
30970 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
30980 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
30990 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
309a0 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
309b0 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
309c0 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
309d0 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  by' */.    u32 n
309e0 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a  Search = 0;   /*
309f0 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   Count of the nu
30a00 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61  mber of search a
30a10 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a  ttempts */.    .
30a20 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
30a30 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
30a40 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
30a50 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
30a60 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
30a70 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
30a80 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
30a90 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
30aa0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
30ab0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
30ac0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
30ad0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
30ae0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
30af0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30b00 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
30b10 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
30b20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
30b30 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
30b40 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
30b50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30b60 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
30b70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
30b80 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
30b90 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
30ba0 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
30bb0 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
30bc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
30bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30be0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
30bf0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
30c00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
30c10 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
30c20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30c30 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
30c40 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
30c50 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
30c60 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
30c70 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
30c80 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
30c90 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
30ca0 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
30cb0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
30cc0 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
30cd0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
30ce0 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
30cf0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
30d00 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
30d10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30d20 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
30d30 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
30d40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
30d50 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
30d60 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
30d70 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
30d80 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
30d90 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
30da0 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
30db0 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
30dc0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
30dd0 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
30de0 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
30df0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
30e00 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
30e10 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
30e20 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
30e30 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
30e40 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
30e50 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
30e60 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
30e70 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
30e80 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
30e90 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
30ea0 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
30eb0 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
30ec0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
30ed0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
30ee0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
30ef0 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31  E-OF: R-01506-11
30f00 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e  053 The first in
30f10 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
30f20 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
30f30 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65         ** is the
30f40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
30f50 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73  the next freelis
30f60 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
30f70 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20  the list or.    
30f80 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74      ** zero if t
30f90 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  his is the last 
30fa0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
30fb0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
30fc0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
30fd0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
30fe0 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
30ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
31000 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
31010 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65  -59841-13798 The
31020 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
31030 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
31040 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20  fset 32.        
31050 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61  ** stores the pa
31060 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
31070 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
31080 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20  he freelist, or 
31090 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20  zero if.        
310a0 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ** the freelist 
310b0 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  is empty. */.   
310c0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
310d0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
310e0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
310f0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
31100 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
31110 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
31120 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c  iTrunk>mxPage ||
31130 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29   nSearch++ > n )
31140 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
31150 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
31160 4e 4f 28 70 50 72 65 76 54 72 75 6e 6b 20 3f 20  NO(pPrevTrunk ? 
31170 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f  pPrevTrunk->pgno
31180 20 3a 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c   : 1);.      }el
31190 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
311a0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
311b0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
311c0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
311d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
311e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
311f0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
31200 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
31210 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
31220 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
31230 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
31240 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
31250 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
31260 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
31270 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
31280 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
31290 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
312a0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
312b0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
312c0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
312d0 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
312e0 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
312f0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
31300 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
31310 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
31320 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
31330 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
31340 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
31350 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
31360 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
31370 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
31380 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
31390 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
313a0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
313b0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
313c0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
313d0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
313e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
313f0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
31400 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31410 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
31420 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
31430 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
31440 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
31450 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
31460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31470 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
31480 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
31490 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
314a0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
314b0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
314c0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
314d0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
314e0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
314f0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
31500 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
31510 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
31520 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
31530 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
31540 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
31550 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
31560 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
31570 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
31580 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
31590 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
315a0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
315b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
315c0 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
315d0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
315e0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
315f0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
31600 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31610 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
31620 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
31630 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
31640 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
31650 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
31660 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
31670 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
31680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
31690 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
316a0 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
316b0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
316c0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
316d0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
316e0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
316f0 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
31700 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
31710 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
31720 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
31730 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
31740 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
31750 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
31760 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31770 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
31780 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31790 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
317a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
317b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
317c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
317d0 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
317e0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
317f0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
31800 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
31810 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
31820 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
31830 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
31840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31860 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
31870 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
31880 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
318a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
318b0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
318c0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
318d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
318e0 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
318f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31900 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
31910 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
31920 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
31930 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
31940 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
31950 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
31960 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
31970 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
31980 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
31990 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
319a0 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
319b0 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
319c0 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
319d0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
319e0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
319f0 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
31a00 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
31a10 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
31a20 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
31a30 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
31a40 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
31a50 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
31a60 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
31a70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31a80 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54  _CORRUPT_PGNO(iT
31a90 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
31aa0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31ab0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31ad0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
31ae0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
31af0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
31b00 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
31b10 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
31b20 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
31b30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31b40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
31b60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
31b70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
31b80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31b90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31ba0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
31bb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31be0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
31bf0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
31c00 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31c10 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31c30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
31c40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
31c50 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
31c60 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
31c70 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
31c80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
31c90 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
31ca0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
31cb0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
31cc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
31cd0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
31ce0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
31cf0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
31d00 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
31d10 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
31d20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
31d30 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31d40 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
31d50 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
31d60 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
31d70 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
31d80 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
31d90 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
31da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31db0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31dc0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
31dd0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31de0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
31df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
31e00 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
31e10 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
31e20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
31e30 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
31e40 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31e50 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
31e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31e70 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
31e80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
31e90 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
31ea0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
31eb0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
31ec0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
31ed0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
31ee0 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
31ef0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
31f00 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
31f10 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
31f20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
31f30 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
31f40 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
31f50 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
31f60 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
31f70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
31f80 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
31f90 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
31fa0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
31fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31fc0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
31fd0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
31fe0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
31ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
32000 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
32010 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
32020 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
32030 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
32040 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
32050 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
32060 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
32070 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32080 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
320a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
320b0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
320c0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
320d0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
320e0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
320f0 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
32100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
32110 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
32120 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32130 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
32140 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
32150 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
32160 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
32170 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
32180 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
32190 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
321a0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
321b0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
321c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
321d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
321e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
321f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32200 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
32210 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
32220 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
32230 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
32240 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
32250 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
32260 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
32270 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
32280 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
32290 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
322a0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
322b0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
322c0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
322d0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
322e0 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
322f0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
32300 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
32310 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
32320 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
32330 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
32340 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
32350 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
32360 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
32370 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
32380 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
32390 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
323a0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
323b0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
323c0 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
323d0 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
323e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
323f0 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
32400 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
32410 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
32420 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
32430 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
32440 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
32450 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32460 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
32470 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
32480 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32490 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
324a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
324b0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
324c0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
324d0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
324e0 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
324f0 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
32500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32510 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
32520 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
32530 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
32540 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
32550 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
32560 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
32570 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
32580 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
32590 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
325a0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
325b0 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
325c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
325d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
325e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
325f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32600 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
32610 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
32620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32630 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32640 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32650 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
32660 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
32670 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
32680 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
32690 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
326a0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
326b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
326c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
326d0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
326e0 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
326f0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
32700 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
32710 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
32720 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
32730 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
32740 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
32750 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
32760 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
32770 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32780 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
32790 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
327a0 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
327b0 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
327c0 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
327d0 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
327e0 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
327f0 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
32800 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
32810 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
32820 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
32830 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
32840 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
32850 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
32860 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
32870 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
32880 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
32890 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
328a0 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
328b0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
328c0 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
328d0 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
328e0 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
328f0 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
32900 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
32910 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
32920 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
32930 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
32940 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
32950 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
32960 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
32970 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
32980 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
32990 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
329a0 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
329b0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
329c0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
329d0 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
329e0 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
329f0 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
32a00 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
32a10 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
32a20 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
32a30 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
32a40 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
32a50 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
32a60 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
32a70 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
32a80 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
32a90 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
32aa0 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
32ab0 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
32ac0 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
32ad0 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
32ae0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
32af0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
32b00 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
32b10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32b20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
32b30 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
32b40 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
32b50 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f  ->bDoTruncate))?
32b60 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
32b70 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20  TENT:0;..    rc 
32b80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32b90 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
32ba0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
32bb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32bc0 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  c;.    pBt->nPag
32bd0 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74  e++;.    if( pBt
32be0 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
32bf0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
32c00 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  ) pBt->nPage++;.
32c10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32c20 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32c30 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
32c40 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
32c50 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
32c60 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20  t->nPage) ){.   
32c70 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
32c80 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
32c90 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
32ca0 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
32cb0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
32cc0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
32cd0 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
32ce0 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
32cf0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
32d00 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
32d10 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
32d20 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
32d30 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
32d40 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
32d50 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
32d60 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
32d70 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
32d80 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
32d90 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
32da0 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74  ap page)\n", pBt
32db0 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20  ->nPage));.     
32dc0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
32dd0 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age!=PENDING_BYT
32de0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
32df0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
32e00 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
32e10 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
32e20 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  Pg, bNoContent);
32e30 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
32e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32e60 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
32e70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32e80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
32e90 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
32ea0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32eb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
32ec0 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
32ed0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
32ee0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
32ef0 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
32f00 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
32f10 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
32f20 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
32f30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
32f40 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
32f50 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
32f60 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
32f70 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
32f80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32f90 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
32fa0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
32fb0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
32fc0 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65  ppPage, bNoConte
32fd0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
32fe0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32ff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33000 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
33010 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
33020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33030 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
33040 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
33050 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
33060 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  = 0;.    }.    T
33070 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
33080 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
33090 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
330a0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
330b0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
330c0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
330d0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
330e0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
330f0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
33100 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
33110 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65  evTrunk);.  asse
33120 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
33130 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  K || sqlite3Page
33140 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
33150 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
33160 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  )<=1 );.  assert
33170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33180 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  || (*ppPage)->is
33190 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Init==0 );.  ret
331a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
331b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
331c0 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
331d0 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
331e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
331f0 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
33200 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
33210 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
33220 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
33230 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
33240 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
33250 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
33260 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
33270 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
33280 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
33290 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
332a0 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
332b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
332c0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
332d0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
332e0 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
332f0 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
33300 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
33310 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
33320 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
33330 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
33340 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
33350 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
33360 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
33370 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
33380 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
33390 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
333a0 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
333b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
333c0 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
333d0 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
333e0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
333f0 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
33400 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
33410 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
33420 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
33430 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
33440 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
33450 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33460 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
33470 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
33480 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
33490 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
334a0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
334b0 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
334c0 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
334d0 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
334e0 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
334f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33500 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
33510 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
33520 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
33530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33550 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
33560 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33580 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
33590 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
335a0 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
335b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
335c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
335d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
335e0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
335f0 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  || iPage>1 );.  
33600 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
33610 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
33620 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
33630 20 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72   if( iPage<2 ) r
33640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
33650 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28  RUPT_BKPT;.  if(
33660 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
33670 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
33680 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
33690 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
336a0 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
336b0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
336c0 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
336d0 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
336e0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
336f0 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
33700 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
33710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33720 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
33730 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
33740 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
33750 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
33760 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
33770 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
33780 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
33790 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
337a0 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
337b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
337c0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
337d0 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
337e0 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
337f0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
33800 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
33810 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
33820 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
33830 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
33840 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
33850 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
33860 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
33870 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
33880 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
33890 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
338a0 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
338b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
338c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
338d0 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
338e0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
338f0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
33900 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
33910 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
33920 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
33930 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
33940 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
33950 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
33960 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
33970 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
33980 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
33990 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
339a0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
339b0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
339c0 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
339d0 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
339e0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
339f0 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
33a00 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
33a10 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
33a20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
33a30 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
33a40 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
33a50 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
33a60 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
33a70 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
33a80 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
33a90 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
33aa0 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
33ab0 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
33ac0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
33ad0 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
33ae0 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
33af0 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
33b00 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
33b10 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
33b20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
33b30 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
33b40 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
33b50 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
33b60 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
33b70 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
33b80 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
33b90 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
33ba0 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
33bb0 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
33bc0 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
33bd0 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
33be0 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
33bf0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
33c00 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
33c10 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
33c20 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
33c30 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
33c40 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
33c50 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
33c60 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
33c70 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
33c80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
33ca0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
33cb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
33cc0 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
33cd0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
33ce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
33cf0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
33d00 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
33d10 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
33d20 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
33d30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
33d40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33d50 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
33d60 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
33d70 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
33d80 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
33d90 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
33da0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
33db0 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
33dc0 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
33dd0 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
33de0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
33df0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
33e00 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
33e10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
33e20 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
33e30 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
33e40 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
33e50 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
33e60 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
33e70 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
33e80 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
33e90 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
33ea0 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
33eb0 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
33ec0 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
33ed0 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
33ee0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
33ef0 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
33f00 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
33f10 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
33f20 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
33f30 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
33f40 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
33f50 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
33f60 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
33f70 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
33f80 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
33f90 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
33fa0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
33fb0 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
33fc0 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
33fd0 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
33fe0 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
33ff0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
34000 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
34010 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
34020 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
34030 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
34040 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
34050 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
34060 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
34070 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
34080 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
34090 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
340a0 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
340b0 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
340c0 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
340d0 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
340e0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
340f0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
34100 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
34110 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48   R-19920-11576 H
34120 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65  owever, newer ve
34130 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
34140 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20   still.      ** 
34150 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20  avoid using the 
34160 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73  last six entries
34170 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   in the freelist
34180 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61   trunk page arra
34190 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  y in.      ** or
341a0 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73  der that databas
341b0 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
341c0 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
341d0 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20  s of SQLite can 
341e0 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  be.      ** read
341f0 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
34200 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20  ns of SQLite..  
34210 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
34220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34230 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
34240 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
34250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34260 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
34270 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
34280 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
34290 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
342a0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
342b0 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
342c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
342d0 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
342e0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
342f0 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
34300 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
34310 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
34320 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
34330 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34340 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
34350 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
34360 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
34370 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
34380 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
34390 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
343a0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
343b0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
343c0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
343d0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
343e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
343f0 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
34400 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
34410 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
34420 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
34430 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
34440 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
34450 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
34460 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
34470 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
34480 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
34490 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
344a0 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
344b0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
344c0 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
344d0 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
344e0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
344f0 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
34500 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
34510 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
34520 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
34530 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
34540 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
34550 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
34560 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
34570 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
34580 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
34590 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
345a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
345b0 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
345c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
345d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
345e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
345f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
34600 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34610 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
34620 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
34630 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
34640 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
34650 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
34660 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
34670 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
34680 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
34690 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
346a0 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
346b0 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
346c0 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
346d0 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
346e0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
346f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
34700 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
34710 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
34720 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
34730 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
34740 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
34750 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
34760 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
34770 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
34780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34790 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
347a0 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
347b0 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
347c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
347d0 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
347e0 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
347f0 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
34800 6e 20 43 65 6c 6c 2e 20 20 53 74 6f 72 65 0a 2a  n Cell.  Store.*
34810 2a 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * size informati
34820 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
34830 6c 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a 73  l in pInfo..*/.s
34840 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
34850 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
34860 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
34870 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
34880 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65   contains the Ce
34890 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
348a0 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
348b0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
348c0 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  f the Cell */.  
348d0 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
348e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
348f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
34900 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  ut the cell */.)
34910 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
34920 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  t;.  Pgno ovflPg
34930 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
34940 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32  int nOvfl;.  u32
34950 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
34960 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34970 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
34980 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
34990 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  );.  pPage->xPar
349a0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
349b0 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69  ell, pInfo);.  i
349c0 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  f( pInfo->nLocal
349d0 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61  ==pInfo->nPayloa
349e0 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
349f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
34a00 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
34a10 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
34a20 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
34a30 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
34a40 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d  ll+pInfo->nSize-
34a50 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  1 > pPage->aData
34a60 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
34a70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20   ){.    /* Cell 
34a80 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
34a90 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   of page */.    
34aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
34ab0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
34ac0 29 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  );.  }.  ovflPgn
34ad0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
34ae0 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  ll + pInfo->nSiz
34af0 65 20 2d 20 34 29 3b 0a 20 20 70 42 74 20 3d 20  e - 4);.  pBt = 
34b00 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
34b10 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
34b20 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
34b30 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
34b40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
34b50 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49  4;.  nOvfl = (pI
34b60 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
34b70 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
34b80 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
34b90 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
34ba0 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
34bb0 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
34bc0 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d  PT_DB && (pInfo-
34bd0 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c  >nPayload + ovfl
34be0 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61  PageSize)<ovflPa
34bf0 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77  geSize).  );.  w
34c00 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
34c10 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
34c20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
34c30 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
34c40 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
34c50 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
34c60 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
34c70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
34c80 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
34c90 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
34ca0 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
34cb0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
34cc0 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
34cd0 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
34ce0 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
34cf0 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
34d00 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
34d10 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
34d20 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
34d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34d40 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
34d50 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
34d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
34d70 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
34d80 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
34d90 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
34da0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
34db0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
34dc0 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
34dd0 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
34de0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
34df0 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
34e00 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
34e10 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
34e20 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
34e30 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
34e40 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
34e50 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
34e60 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
34e70 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
34e80 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
34e90 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
34ea0 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
34eb0 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
34ec0 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
34ed0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
34ee0 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
34ef0 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
34f00 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
34f10 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
34f20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
34f30 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
34f40 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
34f50 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
34f60 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
34f70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
34f80 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
34f90 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
34fa0 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
34fb0 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
34fc0 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
34fd0 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
34fe0 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
34ff0 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
35000 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
35010 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
35020 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
35030 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
35040 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
35050 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
35060 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
35070 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
35080 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
35090 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
350a0 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
350b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
350c0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
350d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
350e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
350f0 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
35100 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
35110 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
35120 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
35130 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
35140 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
35150 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
35160 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
35170 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
35180 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
35190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
351a0 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
351b0 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
351c0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
351d0 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
351e0 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
351f0 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
35200 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
35210 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
35220 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
35230 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
35240 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
35250 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
35260 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
35270 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
35280 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
35290 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
352a0 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
352b0 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
352c0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
352d0 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
352e0 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
352f0 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
35300 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
35310 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
35320 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
35330 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
35340 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
35350 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
35360 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
35370 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
35380 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
35390 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
353a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
353b0 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
353c0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
353d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
353e0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
353f0 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
35400 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
35410 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
35420 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
35430 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
35440 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79    const BtreePay
35450 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20  load *pX,       
35460 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68   /* Payload with
35470 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
35480 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  uct the cell */.
35490 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
354a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354b0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
354c0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
354d0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
354e0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
354f0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
35500 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20 73 70  rc, mn;.  int sp
35510 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
35520 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 3b 0a  ge *pToRelease;.
35530 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
35540 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
35550 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
35560 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
35570 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
35580 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6e 48 65 61  Ovfl;.  int nHea
35590 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
355a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
355b0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
355c0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
355d0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
355e0 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
355f0 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
35600 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
35610 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
35620 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
35630 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
35640 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
35650 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
35660 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
35670 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
35680 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42  >aData[pPage->pB
35690 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
356a0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
356b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
356c0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
356d0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
356e0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
356f0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
35700 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
35710 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ize;.  if( pPage
35720 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
35730 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e  nPayload = pX->n
35740 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f  Data + pX->nZero
35750 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
35760 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63  >pData;.    nSrc
35770 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20   = pX->nData;.  
35780 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35790 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f  >intKeyLeaf ); /
357a0 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  * fillInCell() o
357b0 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c  nly called for l
357c0 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65  eaves */.    nHe
357d0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
357e0 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
357f0 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
35800 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
35810 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
35820 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
35830 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d  )&pX->nKey);.  }
35840 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
35850 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66  ( pX->nKey<=0x7f
35860 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b  ffffff && pX->pK
35870 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72  ey!=0 );.    nSr
35880 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28  c = nPayload = (
35890 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20  int)pX->nKey;.  
358a0 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65    pSrc = pX->pKe
358b0 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  y;.    nHeader +
358c0 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
358d0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
358e0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  Payload);.  }.  
358f0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
35900 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 70  e payload */.  p
35910 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
35920 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 69 66 28  [nHeader];.  if(
35930 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
35940 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
35950 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
35960 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
35970 72 65 20 65 76 65 72 79 74 68 69 6e 67 20 66 69  re everything fi
35980 74 73 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  ts on the btree 
35990 70 61 67 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  page.    ** and 
359a0 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
359b0 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 20  s are required. 
359c0 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64  */.    n = nHead
359d0 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  er + nPayload;. 
359e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
359f0 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  3 );.    testcas
35a00 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69  e( n==4 );.    i
35a10 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a  f( n<4 ) n = 4;.
35a20 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b      *pnSize = n;
35a30 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 72  .    assert( nSr
35a40 63 3c 3d 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  c<=nPayload );. 
35a50 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 72     testcase( nSr
35a60 63 3c 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  c<nPayload );.  
35a70 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
35a80 64 2c 20 70 53 72 63 2c 20 6e 53 72 63 29 3b 0a  d, pSrc, nSrc);.
35a90 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
35aa0 6f 61 64 2b 6e 53 72 63 2c 20 30 2c 20 6e 50 61  oad+nSrc, 0, nPa
35ab0 79 6c 6f 61 64 2d 6e 53 72 63 29 3b 0a 20 20 20  yload-nSrc);.   
35ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35ad0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
35ae0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
35af0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
35b00 61 74 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  at some of the c
35b10 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 6e 65 65 64  ontent will need
35b20 0a 20 20 2a 2a 20 74 6f 20 73 70 69 6c 6c 20 6f  .  ** to spill o
35b30 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
35b40 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20  es..  */.  mn = 
35b50 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
35b60 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61  .  n = mn + (nPa
35b70 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
35b80 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
35b90 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 74 65  eSize - 4);.  te
35ba0 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
35bb0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
35bc0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
35bd0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
35be0 3b 0a 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67  ;.  if( n > pPag
35bf0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
35c00 3d 20 6d 6e 3b 0a 20 20 73 70 61 63 65 4c 65 66  = mn;.  spaceLef
35c10 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65  t = n;.  *pnSize
35c20 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
35c30 20 34 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26   4;.  pPrior = &
35c40 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
35c50 3b 0a 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d  ;.  pToRelease =
35c60 20 30 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c 20 3d   0;.  pgnoOvfl =
35c70 20 30 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   0;.  pBt = pPag
35c80 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 41 74  e->pBt;..  /* At
35c90 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
35ca0 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
35cb0 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
35cc0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
35cd0 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
35ce0 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
35cf0 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
35d00 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
35d10 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
35d20 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
35d30 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
35d40 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
35d50 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
35d60 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
35d70 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
35d80 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
35d90 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
35da0 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
35db0 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
35dc0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
35dd0 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
35de0 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
35df0 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
35e00 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
35e10 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
35e20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
35e30 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
35e40 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
35e50 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
35e60 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
35e70 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
35e80 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
35e90 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
35ea0 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
35eb0 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
35ec0 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
35ed0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
35ee0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20  LITE_DEBUG.  {. 
35ef0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
35f00 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
35f10 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
35f20 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
35f30 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65    assert( nHeade
35f40 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  r==(int)(info.pP
35f50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
35f60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
35f70 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b  nfo.nKey==pX->nK
35f80 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
35f90 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
35fa0 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
35fb0 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
35fc0 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
35fd0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
35fe0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
35ff0 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
36000 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
36010 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
36020 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
36030 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
36040 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
36050 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
36060 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
36070 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
36080 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
36090 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
360a0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
360b0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
360c0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
360d0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
360e0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
360f0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
36100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
36110 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
36120 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36130 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
36140 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
36150 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
36160 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
36170 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
36180 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
36190 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
361a0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
361b0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
361c0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
361d0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
361e0 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
361f0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
36200 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
36210 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
36220 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
36230 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
36240 20 20 69 66 28 20 6e 53 72 63 3e 3d 6e 20 29 7b    if( nSrc>=n ){
36250 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
36260 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
36270 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
36280 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
36290 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
362a0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
362b0 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
362c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
362d0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
362e0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
362f0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
36300 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 30   if( nPayload<=0
36310 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 50   ) break;.    pP
36320 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
36330 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
36340 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
36350 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
36360 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
36370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  ==0 ){.      Mem
36380 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
36390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
363a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
363b0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
363c0 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
363d0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
363e0 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
363f0 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
36400 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
36410 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
36420 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
36430 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
36440 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
36450 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
36460 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
36470 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
36480 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
36490 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
364a0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
364b0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
364c0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
364d0 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
364e0 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
364f0 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
36500 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
36510 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
36520 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
36530 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
36540 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
36550 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
36560 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
36570 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
36580 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
36590 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
365a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
365b0 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
365c0 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
365d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
365e0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
365f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
36600 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
36610 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
36620 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
36630 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
36640 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
36650 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
36660 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
36670 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
36680 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
36690 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
366a0 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
366b0 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
366c0 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
366d0 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
366e0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
366f0 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
36700 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
36710 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
36720 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
36730 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
36740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36750 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
36760 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
36770 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
36780 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
36790 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
367a0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
367b0 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
367c0 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
367d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
367e0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
367f0 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
36800 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
36810 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
36820 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
36830 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
36840 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
36850 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
36860 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
36870 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
36880 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
36890 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
368a0 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
368b0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
368c0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
368d0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
368e0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
368f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
36900 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
36910 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36920 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
36930 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
36940 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
36950 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
36960 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
36970 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
36980 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
36990 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
369a0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
369b0 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
369c0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
369d0 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
369e0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
369f0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
36a00 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
36a10 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
36a20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
36a30 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
36a40 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
36a50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
36a60 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
36a70 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
36a80 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
36a90 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
36aa0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
36ab0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
36ac0 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
36ad0 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
36ae0 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
36af0 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
36b00 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
36b10 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
36b20 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
36b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36b40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
36b50 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
36b60 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
36b70 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
36b80 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
36b90 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
36ba0 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
36bb0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
36bc0 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
36bd0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
36be0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
36bf0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
36c00 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
36c10 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
36c20 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
36c30 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
36c40 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
36c50 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
36c60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
36c70 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
36c80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36c90 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
36ca0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
36cb0 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
36cc0 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20  RC){.  u32 pc;  
36cd0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
36ce0 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
36cf0 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
36d00 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
36d10 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
36d20 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
36d30 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
36d40 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
36d50 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
36d60 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
36d70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
36d80 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
36d90 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
36da0 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
36db0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
36dc0 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
36dd0 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
36de0 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
36df0 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
36e00 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
36e10 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
36e20 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
36e30 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c  PT_DB || sz==cel
36e40 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
36e50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
36e60 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36e70 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
36e80 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
36e90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
36ea0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
36eb0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
36ec0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
36ed0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
36ee0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
36ef0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
36f00 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
36f10 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
36f20 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
36f30 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
36f40 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
36f50 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
36f60 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
36f70 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
36f80 28 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  ( pc+sz > pPage-
36f90 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36fa0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
36fb0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
36fc0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
36fd0 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
36fe0 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
36ff0 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
37000 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
37010 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
37020 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
37030 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
37040 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  Cell==0 ){.    m
37050 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
37060 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64  1], 0, 4);.    d
37070 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
37080 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
37090 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65  ta[hdr+5], pPage
370a0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
370b0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  e);.    pPage->n
370c0 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Free = pPage->pB
370d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
370e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
370f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37100 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d          - pPage-
37110 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20  >childPtrSize - 
37120 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  8;.  }else{.    
37130 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72  memmove(ptr, ptr
37140 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  +2, 2*(pPage->nC
37150 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20  ell - idx));.   
37160 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
37170 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
37180 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
37190 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
371a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
371b0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
371c0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
371d0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
371e0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
371f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
37200 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
37210 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
37220 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
37230 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
37240 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
37250 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
37260 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
37270 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
37280 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
37290 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
372a0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
372b0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
372c0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
372d0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
372e0 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
372f0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
37300 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37310 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
37320 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
37330 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
37340 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
37350 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
37360 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
37370 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
37380 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
37390 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
373a0 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
373b0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43  nted..**.** *pRC
373c0 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f   must be SQLITE_
373d0 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  OK when this rou
373e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
373f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
37400 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
37410 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
37420 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
37430 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
37440 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
37450 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
37460 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
37470 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
37480 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
37490 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
374a0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
374b0 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
374c0 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
374d0 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
374e0 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
374f0 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
37500 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
37510 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
37520 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
37530 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
37540 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
37550 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
37560 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
37570 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
37580 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
37590 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
375a0 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
375b0 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
375c0 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
375d0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
375e0 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
375f0 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
37600 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
37610 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
37620 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
37630 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
37640 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
37650 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
37660 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20  */.  u8 *pIns;  
37670 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
37680 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  int in pPage->aC
37690 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e  ellIdx[] where n
376a0 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  o cell inserted 
376b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  */..  assert( *p
376c0 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  RC==SQLITE_OK );
376d0 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
376e0 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
376f0 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
37700 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
37710 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
37720 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
37730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
37740 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
37750 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f  Page->pBt) || CO
37760 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
37770 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
37780 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
37790 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
377a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72   );.  assert( Ar
377b0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
377c0 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a  pOvfl)==ArraySiz
377d0 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29  e(pPage->aiOvfl)
377e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
377f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
37800 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
37810 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
37820 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  cell should norm
37830 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f  ally be sized co
37840 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65  rrectly.  Howeve
37850 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61  r, when moving a
37860 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  .  ** malformed 
37870 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
37880 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65   page to an inte
37890 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68  rior page, if th
378a0 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a  e cell size.  **
378b0 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65   wanted to be le
378c0 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f  ss than 4 but go
378d0 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  t rounded up to 
378e0 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74  4 on the leaf, t
378f0 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69  hen size.  ** mi
37900 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
37910 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20   8 (leaf-size + 
37920 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20  pointer) on the 
37930 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
37940 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74  Hence.  ** the t
37950 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c  erm after the ||
37960 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
37970 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20  g assert(). */. 
37980 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61   assert( sz==pPa
37990 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
379a0 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
379b0 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
379c0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
379d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
379e0 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
379f0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
37a00 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
37a10 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c  py(pTemp, pCell,
37a20 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c   sz);.      pCel
37a30 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
37a40 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
37a50 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
37a60 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
37a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
37a80 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
37a90 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61  ++;.    /* Compa
37aa0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72  rison against Ar
37ab0 72 61 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20  raySize-1 since 
37ac0 77 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65  we hold back one
37ad0 20 65 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20   extra slot.    
37ae0 2a 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65  ** as a continge
37af0 6e 63 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ncy.  In other w
37b00 6f 72 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64  ords, never need
37b10 20 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65   more than 3 ove
37b20 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f  rflow.    ** slo
37b30 74 73 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c  ts but 4 are all
37b40 6f 63 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20  ocated, just to 
37b50 62 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20  be safe. */.    
37b60 61 73 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61  assert( j < Arra
37b70 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
37b80 76 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50  vfl)-1 );.    pP
37b90 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
37ba0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
37bb0 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
37bc0 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57  u16)i;..    /* W
37bd0 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  hen multiple ove
37be0 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68  rflows occur, th
37bf0 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65  ey are always se
37c00 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a  quential and in.
37c10 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72      ** sorted or
37c20 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72  der.  This invar
37c30 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61  iants arise beca
37c40 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  use multiple ove
37c50 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a  rflows can.    *
37c60 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  * only occur whe
37c70 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69  n inserting divi
37c80 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
37c90 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64  he parent page d
37ca0 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c  uring.    ** bal
37cb0 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  ancing, and the 
37cc0 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a  dividers are adj
37cd0 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64  acent and sorted
37ce0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
37cf0 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61  ert( j==0 || pPa
37d00 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c  ge->aiOvfl[j-1]<
37d10 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65  (u16)i ); /* Ove
37d20 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64  rflows in sorted
37d30 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73   order */.    as
37d40 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d  sert( j==0 || i=
37d50 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a  =pPage->aiOvfl[j
37d60 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76  -1]+1 );   /* Ov
37d70 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75  erflows are sequ
37d80 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73  ential */.  }els
37d90 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
37da0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37db0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
37dc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
37dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37de0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
37df0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
37e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
37e10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37e20 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
37e30 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
37e40 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
37e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61  .    assert( &da
37e60 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
37e70 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43  fset]==pPage->aC
37e80 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63  ellIdx );.    rc
37e90 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
37ea0 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
37eb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
37ec0 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
37ed0 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
37ee0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
37ef0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
37f00 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
37f10 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  g properties.   
37f20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
37f30 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a  s successfully *
37f40 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
37f50 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  x >= 0 );.    as
37f60 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61  sert( idx >= pPa
37f70 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
37f80 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20  *pPage->nCell+2 
37f90 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
37fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
37fb0 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
37fc0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
37fd0 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
37fe0 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
37ff0 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
38000 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
38010 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
38020 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
38030 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
38040 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
38050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73  ;.    }.    pIns
38060 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49   = pPage->aCellI
38070 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65  dx + i*2;.    me
38080 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49  mmove(pIns+2, pI
38090 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  ns, 2*(pPage->nC
380a0 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70  ell - i));.    p
380b0 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64  ut2byte(pIns, id
380c0 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  x);.    pPage->n
380d0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69  Cell++;.    /* i
380e0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c  ncrement the cel
380f0 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  l count */.    i
38100 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65  f( (++data[pPage
38110 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d  ->hdrOffset+4])=
38120 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d  =0 ) data[pPage-
38130 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b  >hdrOffset+3]++;
38140 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
38150 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
38160 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
38170 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
38180 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
38190 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
381a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
381b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
381c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
381d0 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
381e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
381f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
38200 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
38210 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
38220 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
38230 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
38240 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
38250 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
38260 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
38270 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
38280 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
38290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c  .}../*.** A Cell
382a0 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  Array object con
382b0 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66  tains a cache of
382c0 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69   pointers and si
382d0 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e  zes for a.** con
382e0 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63  secutive sequenc
382f0 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20  e of cells that 
38300 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e  might be held on
38310 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e   multiple pages.
38320 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
38330 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c  ct CellArray Cel
38340 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43  lArray;.struct C
38350 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74  ellArray {.  int
38360 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
38370 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
38380 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
38390 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  l[] */.  MemPage
383a0 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20   *pRef;         
383b0 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61   /* Reference pa
383c0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
383d0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
383e0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
383f0 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
38400 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
38410 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
38420 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
38430 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
38440 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  */.};../*.** Mak
38450 65 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20  e sure the cell 
38460 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64  sizes at idx, id
38470 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e