/ Hex Artifact Content
Login

Artifact 0a170b7bb69035f6e5c4d722e907b908c5480e83:


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 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 34 35 20 32 30 30 38 2f 30  c,v 1.445 2008/0
0190: 33 2f 32 35 20 30 39 3a 35 36 3a 34 35 20 64 61  3/25 09:56:45 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
0390: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  ST.int sqlite3Bt
03a0: 72 65 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20  reeTrace=0;  /* 
03b0: 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74  True to enable t
03c0: 72 61 63 69 6e 67 20 2a 2f 0a 23 65 6e 64 69 66  racing */.#endif
03d0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
03f0: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 66 6c 61  ACHE./*.** A fla
0400: 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
0410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 68 61  ether or not sha
0420: 72 65 64 20 63 61 63 68 65 20 69 73 20 65 6e 61  red cache is ena
0430: 62 6c 65 64 2e 20 20 41 6c 73 6f 2c 0a 2a 2a 20  bled.  Also,.** 
0440: 61 20 6c 69 73 74 20 6f 66 20 42 74 53 68 61 72  a list of BtShar
0450: 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ed objects that 
0460: 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
0470: 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e 0a 2a   participation.*
0480: 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  * in shared cach
0490: 65 2e 20 20 54 68 65 20 76 61 72 69 61 62 6c 65  e.  The variable
04a0: 73 20 68 61 76 65 20 66 69 6c 65 20 73 63 6f 70  s have file scop
04b0: 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20  e during normal 
04c0: 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20 74  builds,.** but t
04d0: 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73 20  he test harness 
04e0: 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73 20  needs to access 
04f0: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
0500: 73 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 6d 0a  so we make them.
0510: 2a 2a 20 67 6c 6f 62 61 6c 20 66 6f 72 20 74 65  ** global for te
0520: 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  st builds..*/.#i
0530: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0540: 0a 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74  .BtShared *sqlit
0550: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0560: 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
0570: 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61  e3SharedCacheEna
0580: 62 6c 65 64 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  bled = 0;.#else.
0590: 73 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20  static BtShared 
05a0: 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  *sqlite3SharedCa
05b0: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61  cheList = 0;.sta
05c0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 53  tic int sqlite3S
05d0: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
05e0: 64 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  d = 0;.#endif.#e
05f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0600: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0610: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0620: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0630: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0640: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0650: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0660: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0670: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0680: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
0690: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06b0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06c0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06d0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06e0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
06f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0700: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0710: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0720: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0730: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0740: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0750: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0760: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
0770: 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b  nabled = enable;
0780: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
0790: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
07a0: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
07b0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
07c0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61  tic int checkRea
07d0: 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 50 67  dLocks(Btree*,Pg
07e0: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
07f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0800: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0810: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
0820: 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61  unctions queryTa
0830: 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54  bleLock(), lockT
0840: 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63  able() and unloc
0850: 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a  kAllTables().  *
0860: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0870: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0880: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0890: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
08a0: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
08b0: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
08c0: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
08d0: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
08e0: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
08f0: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0900: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0910: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0920: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0930: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0940: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0950: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0960: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0970: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0980: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0990: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
09a0: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
09b0: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
09c0: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  eryTableLock(a,b
09d0: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
09e0: 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c  #define lockTabl
09f0: 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  e(a,b,c) SQLITE_
0a00: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c  OK.  #define unl
0a10: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a  ockAllTables(a).
0a20: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0a30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0a40: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51  ED_CACHE./*.** Q
0a50: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62  uery to see if b
0a60: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
0a70: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
0a80: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
0a90: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
0aa0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
0ab0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
0ac0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
0ad0: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
0ae0: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
0af0: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
0b00: 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61  y calling lockTa
0b10: 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51  ble()), or.** SQ
0b20: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
0b30: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
0b40: 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  t queryTableLock
0b50: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0b60: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0b70: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0b80: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0b90: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0ba0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0bb0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0bc0: 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
0bd0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
0be0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
0bf0: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
0c00: 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  /.  if( !p->shar
0c10: 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75  able ){.    retu
0c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
0c30: 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  }..  /* If some 
0c40: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0c50: 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65   is holding an e
0c60: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74  xclusive lock, t
0c70: 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  he.  ** requeste
0c80: 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62  d lock may not b
0c90: 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f  e obtained..  */
0ca0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63  .  if( pBt->pExc
0cb0: 6c 75 73 69 76 65 20 26 26 20 70 42 74 2d 3e 70  lusive && pBt->p
0cc0: 45 78 63 6c 75 73 69 76 65 21 3d 70 20 29 7b 0a  Exclusive!=p ){.
0cd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0ce0: 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20  E_LOCKED;.  }.. 
0cf0: 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20   /* This (along 
0d00: 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29  with lockTable()
0d10: 29 20 69 73 20 77 68 65 72 65 20 74 68 65 20 52  ) is where the R
0d20: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
0d30: 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c  lag is.  ** deal
0d40: 74 20 77 69 74 68 2e 20 49 66 20 74 68 65 20 63  t with. If the c
0d50: 61 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e  aller is queryin
0d60: 67 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63  g for a read-loc
0d70: 6b 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20 69  k and the flag i
0d80: 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69 74 20 69  s.  ** set, it i
0d90: 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c  s unconditionall
0da0: 79 20 67 72 61 6e 74 65 64 20 2d 20 65 76 65 6e  y granted - even
0db0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 77 72   if there are wr
0dc0: 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f  ite-locks.  ** o
0dd0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  n the table. If 
0de0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  a write-lock is 
0df0: 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 52  requested, the R
0e00: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
0e10: 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  lag.  ** is not 
0e20: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a  considered..  **
0e30: 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f  .  ** In functio
0e40: 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69  n lockTable(), i
0e50: 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  f a read-lock is
0e60: 20 64 65 6d 61 6e 64 65 64 20 61 6e 64 20 74 68   demanded and th
0e70: 65 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f  e .  ** ReadUnco
0e80: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
0e90: 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73  set, no entry is
0ea0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f   added to the lo
0eb0: 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28  cks list .  ** (
0ec0: 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e  BtShared.pLock).
0ed0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75  .  **.  ** To su
0ee0: 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74 68 65 20  mmarize: If the 
0ef0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0f00: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
0f10: 6e 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 64  n read cursors d
0f20: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74  o.  ** not creat
0f30: 65 20 6f 72 20 72 65 73 70 65 63 74 20 74 61 62  e or respect tab
0f40: 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f  le locks. The lo
0f50: 63 6b 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  cking procedure 
0f60: 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77 72 69 74  for a .  ** writ
0f70: 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f  e-cursor does no
0f80: 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
0f90: 20 69 66 28 20 0a 20 20 20 20 21 70 2d 3e 64 62   if( .    !p->db
0fa0: 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e   || .    0==(p->
0fb0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
0fc0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
0fd0: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
0fe0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
0ff0: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
1000: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
1010: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1020: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1030: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1040: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1050: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
1060: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
1070: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
1080: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
1090: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
10a0: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
10b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10c0: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
10d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
10e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
1100: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1110: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1120: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1130: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1140: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
1150: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
1160: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
1170: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
1180: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
1190: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
11a0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
11b0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
11c0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
11d0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
11e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11f0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
1200: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
1210: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
1220: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c  _BUSY and.** SQL
1230: 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c  ITE_NOMEM may al
1240: 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  so be returned..
1250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
1260: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
1270: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
1280: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
1290: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12a0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
12b0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
12c0: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
12d0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
12e0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
12f0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  ;..  /* This is 
1300: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
1310: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
1320: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
1330: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
1340: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1350: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1360: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
1370: 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f  OK==queryTableLo
1380: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
1390: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ock) );..  /* If
13a0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
13b0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
13c0: 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  t and a read-loc
13d0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a  k is requested,.
13e0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c    ** return earl
13f0: 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67  y without adding
1400: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
1410: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20   BtShared.pLock 
1420: 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63  list. See.  ** c
1430: 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69  omment in functi
1440: 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  on queryTableLoc
1450: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  k() for more inf
1460: 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20  o on handling . 
1470: 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f   ** the ReadUnco
1480: 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20  mmitted flag..  
1490: 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70  */.  if( .    (p
14a0: 2d 3e 64 62 29 20 26 26 20 0a 20 20 20 20 28 70  ->db) && .    (p
14b0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
14c0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
14d0: 65 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f  ed) && .    (eLo
14e0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26  ck==READ_LOCK) &
14f0: 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41  &.    iTable!=MA
1500: 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20  STER_ROOT.  ){. 
1510: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1520: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  _OK;.  }..  /* F
1530: 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20  irst search the 
1540: 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73  list for an exis
1550: 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69  ting lock on thi
1560: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
1570: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1580: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1590: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
15a0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
15b0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
15c0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d   pIter->pBtree==
15d0: 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  p ){.      pLock
15e0: 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20   = pIter;.      
15f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1600: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
1610: 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e  ove search did n
1620: 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b  ot find a BtLock
1630: 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74   struct associat
1640: 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a  ing Btree p.  **
1650: 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62   with table iTab
1660: 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65  le, allocate one
1670: 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74   and link it int
1680: 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  o the list..  */
1690: 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b  .  if( !pLock ){
16a0: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74  .    pLock = (Bt
16b0: 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61  Lock *)sqlite3Ma
16c0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
16d0: 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66  BtLock));.    if
16e0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
16f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1700: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
1710: 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d   pLock->iTable =
1720: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f   iTable;.    pLo
1730: 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ck->pBtree = p;.
1740: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74      pLock->pNext
1750: 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1760: 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1770: 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pLock;.  }..  /*
1780: 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e   Set the BtLock.
1790: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
17a0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  o the maximum of
17b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
17c0: 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72  k.  ** and the r
17d0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54  equested lock. T
17e0: 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77  his means if a w
17f0: 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c  rite-lock was al
1800: 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20  ready held.  ** 
1810: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
1820: 72 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f  requested, we do
1830: 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  n't incorrectly 
1840: 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f  downgrade the lo
1850: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ck..  */.  asser
1860: 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45  t( WRITE_LOCK>RE
1870: 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  AD_LOCK );.  if(
1880: 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c   eLock>pLock->eL
1890: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
18a0: 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b  ->eLock = eLock;
18b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
18c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
18d0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
18e0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
18f0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1900: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1910: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ACHE./*.** Relea
1920: 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65  se all the table
1930: 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62   locks (locks ob
1940: 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73  tained via calls
1950: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c   to the lockTabl
1960: 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65  e().** procedure
1970: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
1980: 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61  handle p..*/.sta
1990: 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41  tic void unlockA
19a0: 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a  llTables(Btree *
19b0: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
19c0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19d0: 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20  BtLock **ppIter 
19e0: 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a  = &pBt->pLock;..
19f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a00: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1a10: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1a20: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20   p->sharable || 
1a30: 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20  0==*ppIter );.. 
1a40: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
1a50: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
1a60: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
1a70: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1a80: 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  >pExclusive==0 |
1a90: 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  | pBt->pExclusiv
1aa0: 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  e==pLock->pBtree
1ab0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63   );.    if( pLoc
1ac0: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  k->pBtree==p ){.
1ad0: 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20        *ppIter = 
1ae0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b00: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c  (pLock);.    }el
1b10: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
1b20: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
1b30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1b40: 66 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  f( pBt->pExclusi
1b50: 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74  ve==p ){.    pBt
1b60: 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20 30  ->pExclusive = 0
1b70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
1b80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
1b90: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
1ba0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
1bb0: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
1bc0: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
1bd0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
1be0: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
1bf0: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
1c00: 6f 6c 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20  olds a mutex on 
1c10: 74 68 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  the BtShared.*/.
1c20: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
1c30: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
1c40: 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72  HoldsMutex(BtCur
1c50: 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  sor *p){.  retur
1c60: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
1c70: 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
1c80: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
1c90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ca0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
1cb0: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
1cc0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1cd0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 63  list cache for c
1ce0: 75 72 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61  ursor pCur, if a
1cf0: 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ny..*/.static vo
1d00: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  id invalidateOve
1d10: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72  rflowCache(BtCur
1d20: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
1d30: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1d40: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1d50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d60: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
1d70: 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  .  pCur->aOverfl
1d80: 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ow = 0;.}../*.**
1d90: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
1da0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1db0: 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c  st cache for all
1dc0: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
1dd0: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
1de0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
1df0: 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pBt..*/.static 
1e00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41  void invalidateA
1e10: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1e20: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1e30: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1e40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1e60: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
1e70: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
1e80: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1e90: 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
1ea0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b  verflowCache(p);
1eb0: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
1ec0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
1ed0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78  eOverflowCache(x
1ee0: 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  ).  #define inva
1ef0: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1f00: 77 43 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66  wCache(x).#endif
1f10: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
1f20: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1f30: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
1f40: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
1f50: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
1f60: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
1f70: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
1f80: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
1f90: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
1fa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
1fb0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
1fc0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1fd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1fe0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
1ff0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2000: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
2010: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
2020: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2030: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2040: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
2050: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
2060: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
2070: 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  y);..  /* If thi
2080: 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74  s is an intKey t
2090: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61  able, then the a
20a0: 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72  bove call to Btr
20b0: 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a  eeKeySize().  **
20c0: 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65   stores the inte
20d0: 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d  ger key in pCur-
20e0: 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63  >nKey. In this c
20f0: 61 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ase this value i
2100: 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20  s.  ** all that 
2110: 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  is required. Oth
2120: 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20  erwise, if pCur 
2130: 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61  is not open on a
2140: 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61  n intKey.  ** ta
2150: 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63  ble, then malloc
2160: 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73   space for and s
2170: 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e  tore the pCur->n
2180: 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79  Key bytes of key
2190: 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a   .  ** data..  *
21a0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
21b0: 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72  TE_OK && 0==pCur
21c0: 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29  ->pPage->intKey)
21d0: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
21e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
21f0: 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20  c(pCur->nKey);. 
2200: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
2210: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2220: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
2230: 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  0, pCur->nKey, p
2240: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
2250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2260: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
2270: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
2280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2290: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
22a0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
22b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
22c0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
22e0: 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50 61 67  ert( !pCur->pPag
22f0: 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  e->intKey || !pC
2300: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
2310: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2320: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
2330: 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
2340: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
2350: 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
2360: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2370: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
2380: 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  }..  invalidateO
2390: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
23a0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
23b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
23c0: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
23d0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
23e0: 70 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20  pt pExcept open 
23f0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  on the table .**
2400: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2410: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
2420: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
2430: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
2440: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
2450: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
2460: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
2470: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
2480: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
2490: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
24a0: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
24b0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
24c0: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
24d0: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
24e0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
24f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2500: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2510: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
2520: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
2530: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
2540: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
2550: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
2560: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
2570: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
2580: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
2590: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
25a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
25b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
25d0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
25e0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
25f0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
2600: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2610: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2620: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2630: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2640: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
2650: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
2660: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
2670: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43 75 72  ic void clearCur
2680: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2690: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
26a0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26b0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26d0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
26e0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
26f0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2700: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
2720: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2730: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
2740: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
2750: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
2760: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
2770: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
2780: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
2790: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
27a0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
27b0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
27c0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
27d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
27e0: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
27f0: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
2800: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
2810: 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2820: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
2830: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
2840: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2850: 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  on()..**.** If t
2860: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2870: 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f  nt argument - do
2880: 53 65 65 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c  Seek - is false,
2890: 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66   then instead of
28a0: 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20 74   .** returning t
28b0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
28c0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c   saved position,
28d0: 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74   any saved posit
28e0: 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a  ion is deleted.*
28f0: 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  * and the cursor
2900: 20 73 74 61 74 65 20 73 65 74 20 74 6f 20 43 55   state set to CU
2910: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f  RSOR_INVALID..*/
2920: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2930: 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43  eRestoreOrClearC
2940: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2950: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2960: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
2970: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2980: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2990: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29a0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
29b0: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
29c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29d0: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
29e0: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
29f0: 73 6b 69 70 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  skip;.  }.#ifnde
2a00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2a10: 43 52 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75  CRBLOB.  if( pCu
2a20: 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
2a30: 64 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  dle ){.    retur
2a40: 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
2a50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75    }.#endif.  pCu
2a60: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a70: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
2a80: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2a90: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
2aa0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
2ab0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
2ac0: 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ip);.  if( rc==S
2ad0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ae0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2af0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
2b00: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
2b10: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b20: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2b30: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2b40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2b50: 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65  ALID );.  }.  re
2b60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
2b70: 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  ine restoreOrCle
2b80: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2b90: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
2ba0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
2bb0: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
2bc0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2bd0: 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  RestoreOrClearCu
2be0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2bf0: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
2c00: 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66  ITE_OK)..#ifndef
2c10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c20: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
2c30: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
2c40: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
2c50: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
2c60: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
2c70: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2c80: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2c90: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2ca0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
2cb0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
2cc0: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
2cd0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
2ce0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
2cf0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2d00: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
2d10: 50 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72  Page, iPtrMap, r
2d20: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
2d30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2d40: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2d50: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
2d60: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
2d70: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
2d80: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
2d90: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
2da0: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
2db0: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
2dc0: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
2dd0: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
2de0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2df0: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
2e00: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
2e10: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
2e20: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
2e30: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
2e40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
2e50: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
2e60: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
2e70: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
2e80: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
2e90: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
2ea0: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
2eb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
2ec0: 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  no'..** An error
2ed0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2ee0: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
2ef0: 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72  oes wrong, other
2f00: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
2f10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
2f20: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
2f30: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
2f40: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
2f50: 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67  parent){.  DbPag
2f60: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
2f70: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2f80: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
2f90: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
2fa0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
2fb0: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
2fc0: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
2fd0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
2fe0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
2ff0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
3000: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
3010: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
3020: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
3030: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3040: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
3050: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
3060: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
3070: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
3080: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
3090: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
30a0: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
30b0: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
30c0: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
30d0: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
30e0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
30f0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
3100: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
3110: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
3120: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
3130: 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20  ;.  }.  iPtrmap 
3140: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
3150: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
3160: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
3170: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
3180: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
3190: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
31a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
31b0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f  turn rc;.  }.  o
31c0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
31d0: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65  TROFFSET(pBt, ke
31e0: 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20  y);.  pPtrmap = 
31f0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
3200: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
3210: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
3220: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
3230: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
3240: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
3250: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
3260: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
3270: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
3280: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
3290: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
32a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32b0: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
32c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
32d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e0: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
32f0: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
3300: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
3310: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
3320: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
3330: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
3340: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
3350: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3360: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
3370: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
3380: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
3390: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
33a0: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
33b0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
33c0: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
33d0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
33e0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
33f0: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
3400: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
3410: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
3420: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
3430: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
3440: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
3450: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
3460: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
3470: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
3480: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
3490: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
34a0: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
34b0: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
34c0: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
34d0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
34e0: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
34f0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3500: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
3510: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
3520: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
3530: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
3540: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
3550: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
3560: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
3570: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
3580: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
3590: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35a0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
35b0: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
35c0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
35d0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
35e0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
35f0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
3600: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
3610: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
3620: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
3630: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
3640: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
3650: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
3660: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
3670: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
3680: 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  ET(pBt, key);.  
3690: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
36a0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
36b0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
36c0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
36d0: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
36e0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
36f0: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
3700: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
3710: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
3720: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
3730: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
3740: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
3750: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3760: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
3770: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
3780: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
3790: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
37a0: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
37b0: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
37c0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
37d0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
37e0: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
37f0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
3800: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
3810: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
3820: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
3830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3840: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
3850: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
3860: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
3870: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
3880: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70  efine findCell(p
3890: 50 61 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20  Page, iCell) \. 
38a0: 20 28 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61   ((pPage)->aData
38b0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 28 70 50   + get2byte(&(pP
38c0: 61 67 65 29 2d 3e 61 44 61 74 61 5b 28 70 50 61  age)->aData[(pPa
38d0: 67 65 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  ge)->cellOffset+
38e0: 32 2a 28 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66  2*(iCell)])).#if
38f0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3900: 75 38 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  u8 *sqlite3Btree
3910: 46 69 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65  FindCell(MemPage
3920: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
3930: 6c 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ll){.  assert( i
3940: 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Cell>=0 );.  ass
3950: 65 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62  ert( iCell<get2b
3960: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
3970: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
3980: 65 74 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75  et+3]) );.  retu
3990: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
39a0: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e  e, iCell);.}.#en
39b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
39c0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
39d0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
39e0: 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29  3BtreeFindCell()
39f0: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
3a00: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
3a10: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
3a20: 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e  w cells.  See in
3a30: 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75  sert.*/.static u
3a40: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
3a50: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
3a60: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
3a70: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
3a80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3a90: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
3aa0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3ab0: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
3ac0: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
3ad0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
3ae0: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
3af0: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
3b00: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
3b10: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
3b20: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
3b30: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
3b40: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
3b50: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
3b60: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
3b70: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
3b80: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
3b90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
3ba0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
3bb0: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
3bc0: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
3bd0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
3be0: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
3bf0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
3c00: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
3c10: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
3c20: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c  s function.  sql
3c30: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3c40: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
3c50: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
3c60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
3c70: 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  nt and sqlite3Bt
3c80: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3c90: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
3ca0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
3cb0: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
3cc0: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
3cd0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
3ce0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
3cf0: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
3d00: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
3d10: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
3d20: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
3d30: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
3d40: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
3d50: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
3d60: 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  aster..*/.void s
3d70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3d80: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
3d90: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
3da0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
3db0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
3dc0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3de0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
3df0: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
3e00: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
3e10: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
3e20: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3e30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  */.){.  int n;  
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
3e60: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
3e70: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
3e80: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
3e90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3ea0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
3eb0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
3ec0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3ed0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
3ee0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
3ef0: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
3f00: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
3f10: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
3f20: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
3f30: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
3f40: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
3f50: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
3f60: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
3f70: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
3f80: 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Data ){.    n +=
3f90: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
3fa0: 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61  ell[n], &nPayloa
3fb0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
3fc0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
3fd0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74   }.  pInfo->nDat
3fe0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
3ff0: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
4000: 79 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  y ){.    n += ge
4010: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
4020: 5d 2c 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f  ], (u64 *)&pInfo
4030: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  ->nKey);.  }else
4040: 7b 0a 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20  {.    u32 x;.   
4050: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
4060: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29  2(&pCell[n], &x)
4070: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ;.    pInfo->nKe
4080: 79 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c  y = x;.    nPayl
4090: 6f 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20  oad += x;.  }.  
40a0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
40b0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
40c0: 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e  nfo->nHeader = n
40d0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
40e0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
40f0: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
4100: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
4110: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
4120: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
4130: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
4140: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
4150: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
4160: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
4170: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a   */.    int nSiz
4180: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
4190: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c  otal size of cel
41a0: 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74  l content in byt
41b0: 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d  es */.    pInfo-
41c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f  >nLocal = nPaylo
41d0: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
41e0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
41f0: 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f    nSize = nPaylo
4200: 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20  ad + n;.    if( 
4210: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20  nSize<4 ){.     
4220: 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20   nSize = 4;     
4230: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
4240: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
4250: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
4260: 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a  >nSize = nSize;.
4270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
4280: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
4290: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
42a0: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
42b0: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
42c0: 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69  e.    ** to deci
42d0: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
42e0: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
42f0: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
4300: 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f  ll onto.    ** o
4310: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
4320: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
4330: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
4340: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
4350: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e  .    ** space on
4360: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
4370: 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68  while keeping th
4380: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61  e amount of loca
4390: 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a  l storage.    **
43a0: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
43b0: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
43c0: 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
43d0: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
43e0: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
43f0: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
4400: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
4410: 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69  ny.    ** way wi
4420: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
4430: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
4440: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f  e format..    */
4450: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
4460: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
4470: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
4480: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
4490: 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  .    int maxLoca
44a0: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
44b0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
44c0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
44d0: 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73  .    int surplus
44e0: 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  ;   /* Overflow 
44f0: 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c  payload availabl
4500: 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72  e for local stor
4510: 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c  age */..    minL
4520: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
4530: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c  nLocal;.    maxL
4540: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
4550: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70  xLocal;.    surp
4560: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
4570: 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e   (nPayload - min
4580: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
4590: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
45a0: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72   4);.    if( sur
45b0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
45c0: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
45d0: 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75  >nLocal = surplu
45e0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
45f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
4600: 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  l = minLocal;.  
4610: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
4620: 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f  Overflow = pInfo
4630: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20  ->nLocal + n;.  
4640: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
4650: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
4660: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
4670: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
4680: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
4690: 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42  fo) \.  sqlite3B
46a0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
46b0: 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65  ((pPage), findCe
46c0: 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65  ll((pPage), (iCe
46d0: 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76  ll)), (pInfo)).v
46e0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
46f0: 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d  ParseCell(.  Mem
4700: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
4710: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
4720: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
4730: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c   */.  int iCell,
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4750: 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e   The cell index.
4760: 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20    First cell is 
4770: 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  0 */.  CellInfo 
4780: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
4790: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
47a0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
47b0: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
47c0: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , iCell, pInfo);
47d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
47e0: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
47f0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
4800: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
4810: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
4820: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
4830: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
4840: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
4850: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
4860: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
4870: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
4880: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
4890: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
48a0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
48b0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
48c0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e  pointer..*/.#ifn
48d0: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
48e0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d  c u16 cellSize(M
48f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
4900: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  nt iCell){.  Cel
4910: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71  lInfo info;.  sq
4920: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4930: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4940: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
4950: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
4960: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 75  .#endif.static u
4970: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
4980: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
4990: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
49a0: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71  lInfo info;.  sq
49b0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
49c0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
49d0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72  ell, &info);.  r
49e0: 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65  eturn info.nSize
49f0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
4a00: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
4a10: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
4a20: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
4a30: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
4a40: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
4a50: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
4a60: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
4a70: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
4a80: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
4a90: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
4aa0: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
4ab0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
4ac0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
4ad0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
4ae0: 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c  ll){.  if( pCell
4af0: 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f   ){.    CellInfo
4b00: 20 69 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74   info;.    sqlit
4b10: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
4b20: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
4b30: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
4b40: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
4b50: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
4b60: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
4b70: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
4b80: 0a 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e  .    if( (info.n
4b90: 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
4ba0: 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
4bb0: 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  )>info.nLocal ){
4bc0: 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  .      Pgno ovfl
4bd0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
4be0: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
4bf0: 77 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  w]);.      retur
4c00: 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  n ptrmapPut(pPag
4c10: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
4c20: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
4c30: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
4c40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4c50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
4c60: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
4c70: 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c  with index iCell
4c80: 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20 63   on page pPage c
4c90: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
4ca0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
4cb0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
4cc0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
4cd0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
4ce0: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
4cf0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
4d00: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
4d10: 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Ovfl(MemPage *pP
4d20: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
4d30: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
4d40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
4d50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
4d60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
4d70: 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f  .  pCell = findO
4d80: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
4d90: 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e, iCell);.  ret
4da0: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
4db0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4dc0: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  l);.}.#endif.../
4dd0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
4de0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
4df0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
4e00: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
4e10: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
4e20: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
4e30: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
4e40: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
4e50: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
4e60: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
4e70: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
4e80: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
4e90: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
4ea0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
4eb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
4ec0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
4ed0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
4ee0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
4ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
4f00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
4f10: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
4f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4f30: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
4f40: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ll */.  int addr
4f50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4f60: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
4f70: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
4f80: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
4f90: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ray */.  int hdr
4fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4fb0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
4fc0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
4fd0: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
5000: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
5010: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
5020: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5030: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
5040: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
5050: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
5060: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
5070: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
5080: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
5090: 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20  int brk;        
50a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
50b0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
50c0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
50d0: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50f0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
5100: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
5110: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5120: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
5130: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
5140: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5150: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
5160: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
5170: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  ell content */..
5180: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5190: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
51a0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
51b0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
51c0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
51d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
51e0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
51f0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
5200: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
5210: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
5220: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
5230: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5240: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
5250: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
5260: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
5270: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
5280: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
5290: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
52a0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
52b0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
52c0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
52d0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
52e0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
52f0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
5300: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
5310: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5320: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
5330: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
5340: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
5350: 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
5360: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5370: 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b  .  memcpy(&temp[
5380: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
5390: 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62  , usableSize - b
53a0: 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61  rk);.  brk = usa
53b0: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
53c0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
53d0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
53e0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
53f0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
5400: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
5410: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
5420: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
5430: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
5440: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c  .    assert( pc<
5450: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
5460: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69  leSize );.    si
5470: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
5480: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
5490: 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73  ]);.    brk -= s
54a0: 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ize;.    memcpy(
54b0: 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d  &data[brk], &tem
54c0: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
54d0: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
54e0: 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73  , brk);.  }.  as
54f0: 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f  sert( brk>=cellO
5500: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b  ffset+2*nCell );
5510: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
5520: 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a  a[hdr+5], brk);.
5530: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
5540: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
5550: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
5560: 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20  +7] = 0;.  addr 
5570: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  = cellOffset+2*n
5580: 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Cell;.  memset(&
5590: 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62  data[addr], 0, b
55a0: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 72 65 74 75  rk-addr);.  retu
55b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
55c0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
55d0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
55e0: 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a  pace on a page..
55f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
5600: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
5610: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
5620: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
5630: 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  ** the new alloc
5640: 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e  ation. Or return
5650: 20 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   0 if there is n
5660: 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a  ot enough free.*
5670: 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  * space on the p
5680: 61 67 65 20 74 6f 20 73 61 74 69 73 66 79 20 74  age to satisfy t
5690: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65  he allocation re
56a0: 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  quest..**.** If 
56b0: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
56c0: 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65  s nBytes of free
56d0: 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20   space but does 
56e0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e  not contain.** n
56f0: 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75  Bytes of contigu
5700: 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20  ous free space, 
5710: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
5720: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  e automatically.
5730: 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65  ** calls defrage
5740: 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f  mentPage() to co
5750: 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72  nsolidate all fr
5760: 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ee space before 
5770: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74  .** allocating t
5780: 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f  he new chunk..*/
5790: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
57a0: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
57b0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
57c0: 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  yte){.  int addr
57d0: 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74  , pc, hdr;.  int
57e0: 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72   size;.  int nFr
57f0: 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20  ag;.  int top;. 
5800: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e   int nCell;.  in
5810: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  t cellOffset;.  
5820: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
5830: 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d  ata;.  .  data =
5840: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
5850: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5860: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5870: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5890: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
58a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
58b0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
58c0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
58d0: 20 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e   if( nByte<4 ) n
58e0: 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20  Byte = 4;.  if( 
58f0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79  pPage->nFree<nBy
5900: 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76  te || pPage->nOv
5910: 65 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72  erflow>0 ) retur
5920: 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  n 0;.  pPage->nF
5930: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
5940: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
5950: 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67  Offset;..  nFrag
5960: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
5970: 20 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29    if( nFrag<60 )
5980: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
5990: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
59a0: 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20  king for a slot 
59b0: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
59c0: 74 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a  tisfy the.    **
59d0: 20 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20   space request. 
59e0: 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64  */.    addr = hd
59f0: 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  r+1;.    while( 
5a00: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
5a10: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
5a20: 7b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  {.      size = g
5a30: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
5a40: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
5a50: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
5a60: 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c         if( size<
5a70: 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20  nByte+4 ){.     
5a80: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
5a90: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
5aa0: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
5ab0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
5ac0: 6e 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e  nFrag + size - n
5ad0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Byte;.          
5ae0: 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20  return pc;.     
5af0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5b00: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
5b10: 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e  ta[pc+2], size-n
5b20: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Byte);.         
5b30: 20 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a   return pc + siz
5b40: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
5b50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5b60: 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20     addr = pc;.  
5b70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
5b80: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
5b90: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
5ba0: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
5bb0: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
5bc0: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
5bd0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a  ontent area..  *
5be0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
5bf0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5c00: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ;.  nCell = get2
5c10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
5c20: 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  ]);.  cellOffset
5c30: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
5c40: 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61  fset;.  if( nFra
5c50: 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66  g>=60 || cellOff
5c60: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20  set + 2*nCell > 
5c70: 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20  top - nByte ){. 
5c80: 20 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e     if( defragmen
5c90: 74 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72  tPage(pPage) ) r
5ca0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70  eturn 0;.    top
5cb0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5cc0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20  a[hdr+5]);.  }. 
5cd0: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
5ce0: 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66   assert( cellOff
5cf0: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d  set + 2*nCell <=
5d00: 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79   top );.  put2by
5d10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
5d20: 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20   top);.  return 
5d30: 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  top;.}../*.** Re
5d40: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
5d50: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
5d60: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
5d70: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
5d80: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
5d90: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
5da0: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
5db0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
5dc0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
5dd0: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
5de0: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
5df0: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
5e00: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
5e10: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
5e20: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
5e30: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
5e40: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
5e50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
5e60: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
5e70: 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74  pPage, int start
5e80: 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69  , int size){.  i
5e90: 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c  nt addr, pbegin,
5ea0: 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64   hdr;.  unsigned
5eb0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
5ec0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
5ed0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
5ee0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
5ef0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
5f00: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
5f10: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
5f20: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
5f30: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
5f40: 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
5f50: 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  4) );.  assert( 
5f60: 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d  (start + size)<=
5f70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
5f80: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
5f90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5fa0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
5fb0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
5fc0: 66 28 20 73 69 7a 65 3c 34 20 29 20 73 69 7a 65  f( size<4 ) size
5fd0: 20 3d 20 34 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 4;..#ifdef SQ
5fe0: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
5ff0: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
6000: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
6010: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
6020: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
6030: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
6040: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
6050: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
6060: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
6070: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
6080: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
6090: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
60a0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
60b0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
60c0: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
60d0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
60e0: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
60f0: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
6100: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6110: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
6120: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
6130: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6140: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
6150: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
6160: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
6170: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
6180: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
6190: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
61a0: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
61b0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
61c0: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 );.  assert( p
61d0: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
61e0: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
61f0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
6200: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
6210: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
6220: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
6230: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
6240: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
6250: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
6260: 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61   size;..  /* Coa
6270: 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66  lesce adjacent f
6280: 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ree blocks */.  
6290: 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64  addr = pPage->hd
62a0: 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77  rOffset + 1;.  w
62b0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
62c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
62d0: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
62e0: 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65  int pnext, psize
62f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
6300: 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20  egin>addr );.   
6310: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
6320: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
6330: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
6340: 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74   pnext = get2byt
6350: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29  e(&data[pbegin])
6360: 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65  ;.    psize = ge
6370: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
6380: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  gin+2]);.    if(
6390: 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20   pbegin + psize 
63a0: 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20  + 3 >= pnext && 
63b0: 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pnext>0 ){.     
63c0: 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78   int frag = pnex
63d0: 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a  t - (pbegin+psiz
63e0: 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
63f0: 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61  ( frag<=data[pPa
6400: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
6410: 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70   );.      data[p
6420: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
6430: 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20  7] -= frag;.    
6440: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
6450: 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79  [pbegin], get2by
6460: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29  te(&data[pnext])
6470: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
6480: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
6490: 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74  ], pnext+get2byt
64a0: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
64b0: 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d  )-pbegin);.    }
64c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
64d0: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
64e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
64f0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
6500: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
6510: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
6520: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
6530: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
6540: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
6550: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
6560: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
6570: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
6580: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6590: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
65a0: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
65b0: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
65c0: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
65d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
65e0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74  hdr+5]);.    put
65f0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
6600: 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79  5], top + get2by
6610: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
6620: 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  2]));.  }.}../*.
6630: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
6640: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
6650: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
6660: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
6670: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
6680: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
6690: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
66a0: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
66b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
66c0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
66d0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
66e0: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
66f0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
6700: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
6710: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
6720: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
6730: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
6740: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
6750: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
6760: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6770: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6780: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
6790: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66 6c 61  e->intKey = (fla
67a0: 67 42 79 74 65 20 26 20 28 50 54 46 5f 49 4e 54  gByte & (PTF_INT
67b0: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
67c0: 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  ))!=0;.  pPage->
67d0: 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c 61 67  zeroData = (flag
67e0: 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52 4f 44  Byte & PTF_ZEROD
67f0: 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  ATA)!=0;.  pPage
6800: 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67 42 79  ->leaf = (flagBy
6810: 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d  te & PTF_LEAF)!=
6820: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  0;.  pPage->chil
6830: 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28 70 50  dPtrSize = 4*(pP
6840: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a 20  age->leaf==0);. 
6850: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
6860: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
6870: 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41  e & PTF_LEAFDATA
6880: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c   ){.    pPage->l
6890: 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20 20 20  eafData = 1;.   
68a0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
68b0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
68c0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
68d0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
68e0: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eaf;.  }else{.  
68f0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74    pPage->leafDat
6900: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
6910: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
6920: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
6930: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
6940: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
6950: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 68 61  .  }.  pPage->ha
6960: 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d  sData = !(pPage-
6970: 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70  >zeroData || (!p
6980: 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50  Page->leaf && pP
6990: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b  age->leafData));
69a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
69b0: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
69c0: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
69d0: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
69e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
69f0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  nt parameter mus
6a00: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
6a10: 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 77 68  o the MemPage wh
6a20: 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20 70 61  ich.** is the pa
6a30: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
6a40: 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a   being initializ
6a50: 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66  ed.  The root of
6a60: 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61 73 20   a.** BTree has 
6a70: 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20 73 6f  no parent and so
6a80: 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2c 20   for that page, 
6a90: 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a  pParent==NULL..*
6aa0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
6ab0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
6ac0: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
6ad0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
6ae0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
6af0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
6b00: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
6b10: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
6b20: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
6b30: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
6b40: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
6b50: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
6b60: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
6b70: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
6b80: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
6b90: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
6ba0: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
6bb0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69  corruption..*/.i
6bc0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
6bd0: 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  nitPage(.  MemPa
6be0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
6bf0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
6c00: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
6c10: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
6c20: 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54  arent       /* T
6c30: 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68  he parent.  Migh
6c40: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6c50: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
6c60: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6c70: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
6c80: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
6c90: 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ta[] */.  int hd
6ca0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
6cb0: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
6cc0: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
6cd0: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
6ce0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
6cf0: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
6d00: 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ata */.  BtShare
6d10: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
6d20: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
6d30: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
6d40: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
6d50: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
6d60: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
6d70: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  each page */.  i
6d80: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
6d90: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
6da0: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
6db0: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
6dc0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  nter */.  int nF
6dd0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
6de0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
6df0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
6e00: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
6e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
6e20: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
6e30: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
6e40: 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  a */..  pBt = pP
6e50: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
6e60: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
6e70: 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
6e80: 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70  =0 || pParent->p
6e90: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73  Bt==pBt );.  ass
6ea0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6eb0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6ec0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
6ed0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
6ee0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
6ef0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
6f00: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
6f10: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
6f20: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
6f30: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
6f40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6f50: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
6f60: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6f70: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
6f80: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
6f90: 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e  >pParent!=pParen
6fa0: 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61  t && (pPage->pPa
6fb0: 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65  rent!=0 || pPage
6fc0: 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20  ->isInit) ){.   
6fd0: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70   /* The parent p
6fe0: 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  age should never
6ff0: 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74   change unless t
7000: 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  he file is corru
7010: 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  pt */.    return
7020: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7030: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
7040: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20  pPage->isInit ) 
7050: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7060: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
7070: 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61  Parent==0 && pPa
7080: 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70  rent!=0 ){.    p
7090: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
70a0: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
70b0: 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
70c0: 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
70d0: 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
70e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
70f0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
7100: 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  ata;.  decodeFla
7110: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
7120: 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  dr]);.  pPage->n
7130: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7140: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
7150: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
7160: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
7170: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
7180: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
7190: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
71a0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
71b0: 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  ;.  top = get2by
71c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
71d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
71e0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
71f0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28  a[hdr+3]);.  if(
7200: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
7210: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
7220: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
7230: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
7240: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
7250: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
7260: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
7270: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7280: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  T;.  }.  if( pPa
7290: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ge->nCell==0 && 
72a0: 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50  pParent!=0 && pP
72b0: 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  arent->pgno!=1 )
72c0: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67  {.    /* All pag
72d0: 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20  es must have at 
72e0: 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20  least one cell, 
72f0: 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20  except for root 
7300: 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  pages */.    ret
7310: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7320: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
7330: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
7340: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
7350: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
7360: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
7370: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
7380: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
7390: 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c  +7] + top - (cel
73a0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
73b0: 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69  e->nCell);.  whi
73c0: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
73d0: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
73e0: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
73f0: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
7400: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69   /* Free block i
7410: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
7420: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
7430: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7440: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
7450: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
7460: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73  data[pc]);.    s
7470: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
7480: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
7490: 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e   if( next>0 && n
74a0: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
74b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
74c0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
74d0: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
74e0: 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
74f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7500: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
7510: 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b    nFree += size;
7520: 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a  .    pc = next;.
7530: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
7540: 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66  ee = nFree;.  if
7550: 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53  ( nFree>=usableS
7560: 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72  ize ){.    /* Fr
7570: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
7580: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
7590: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65  e size */.    re
75a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
75b0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
75c0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
75d0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
75e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
75f0: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
7600: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
7610: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
7620: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
7630: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
7640: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7650: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
7660: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
7670: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
7680: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
7690: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
76a0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
76b0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68  ge->pBt;.  int h
76c0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
76d0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72  ffset;.  int fir
76e0: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
76f0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
7700: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
7710: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
7720: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
7730: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
7740: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
7750: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
7760: 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
7770: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
7780: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
7790: 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
77a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
77b0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
77c0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
77d0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
77e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
77f0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7800: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
7810: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
7820: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
7830: 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  ;.  data[hdr] = 
7840: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
7850: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
7860: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
7870: 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  0);.  memset(&da
7880: 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
7890: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
78a0: 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
78b0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
78c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
78d0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
78e0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
78f0: 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f   - first;.  deco
7900: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
7910: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
7920: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
7930: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
7940: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
7950: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
7960: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
7970: 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70  dxShift = 0;.  p
7980: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
7990: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
79a0: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = 1;.}../*.** G
79b0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
79c0: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
79d0: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
79e0: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
79f0: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
7a00: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
7a10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
7a20: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
7a30: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
7a40: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
7a50: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
7a60: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
7a70: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
7a80: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
7a90: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
7aa0: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
7ab0: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
7ac0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
7ad0: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
7ae0: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
7af0: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
7b00: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
7b10: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
7b20: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
7b30: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
7b40: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
7b50: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
7b60: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
7b70: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
7b80: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
7b90: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
7ba0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
7bb0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
7bc0: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
7bd0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
7be0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7bf0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
7c00: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
7c10: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
7c20: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
7c30: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
7c40: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
7c50: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
7c60: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
7c70: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
7c80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7c90: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
7ca0: 65 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  e;.  DbPage *pDb
7cb0: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
7cc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7cd0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7ce0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7cf0: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
7d00: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
7d10: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
7d20: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
7d30: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
7d40: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d  rn rc;.  pPage =
7d50: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
7d60: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
7d70: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
7d80: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
7d90: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
7da0: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
7db0: 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
7dc0: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
7dd0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
7de0: 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
7df0: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
7e00: 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  et = pPage->pgno
7e10: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
7e20: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
7e30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7e40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
7e50: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
7e60: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
7e70: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
7e80: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
7e90: 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e  just a convenien
7ea0: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
7eb0: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
7ec0: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
7ed0: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
7ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
7ef0: 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  tPage()..*/.stat
7f00: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
7f10: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
7f20: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
7f30: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
7f40: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
7f50: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
7f60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
7f70: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
7f80: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
7f90: 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
7fa0: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
7fb0: 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   here */.  MemPa
7fc0: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
7fd0: 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65  /* Parent of the
7fe0: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
7ff0: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
8000: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8010: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
8020: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
8030: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8040: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8050: 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  T; .  }.  rc = s
8060: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
8070: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
8080: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
8090: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
80a0: 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
80b0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  it==0 ){.    rc 
80c0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
80d0: 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20  itPage(*ppPage, 
80e0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
80f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8100: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
8110: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
8120: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
8130: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
8140: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c  r.** call to sql
8150: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
8160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8170: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
8180: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8190: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
81a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
81b0: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
81c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
81d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
81e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
81f0: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
8200: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
8210: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
8220: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
8230: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
8240: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
8250: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
8260: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8270: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8280: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
8290: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
82a0: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
82b0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
82c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
82d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
82e0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
82f0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 72   for a page.** r
8300: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 57 65  eaches zero.  We
8310: 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66 20 74   need to unref t
8320: 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  he pParent point
8330: 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a 2a 20  er when that.** 
8340: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74  happens..*/.stat
8350: 69 63 20 76 6f 69 64 20 70 61 67 65 44 65 73 74  ic void pageDest
8360: 72 75 63 74 6f 72 28 44 62 50 61 67 65 20 2a 70  ructor(DbPage *p
8370: 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69  Data, int pageSi
8380: 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ze){.  MemPage *
8390: 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
83a0: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
83b0: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
83c0: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
83d0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
83e0: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
83f0: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
8400: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
8410: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8420: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8430: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
8440: 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  ent ){.    MemPa
8450: 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50  ge *pParent = pP
8460: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
8470: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
8480: 74 2d 3e 70 42 74 3d 3d 70 50 61 67 65 2d 3e 70  t->pBt==pPage->p
8490: 42 74 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  Bt );.    pPage-
84a0: 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
84b0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
84c0: 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50  arent);.  }.  pP
84d0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
84e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  .}../*.** During
84f0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
8500: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
8510: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
8520: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
8530: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
8540: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
8550: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
8560: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
8570: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
8580: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
8590: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
85a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
85b0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
85c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
85d0: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
85e0: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
85f0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
8600: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
8610: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
8620: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
8630: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8640: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
8650: 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69  Data, int pageSi
8660: 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ze){.  MemPage *
8670: 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
8680: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
8690: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
86a0: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
86b0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
86c0: 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50  pData);.  if( pP
86d0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
86e0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
86f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8700: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8710: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
8720: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 73  sInit = 0;.    s
8730: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
8740: 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
8750: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  ->pParent);.  }.
8760: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
8770: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
8780: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
8790: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
87a0: 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75  te3BtreeInvokeBu
87b0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
87c0: 70 41 72 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  pArg, int n){.  
87d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
87e0: 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
87f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
8800: 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
8810: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8820: 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
8830: 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
8840: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
8850: 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
8860: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
8870: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
8880: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
8890: 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
88a0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
88b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
88c0: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
88d0: 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77  is NULL.** a new
88e0: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
88f0: 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20   random name is 
8900: 63 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72  created.  This r
8910: 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a  andomly named.**
8920: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
8930: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77  ill be deleted w
8940: 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
8950: 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
8960: 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  d..** If zFilena
8970: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
8980: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
8990: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
89a0: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
89b0: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
89c0: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
89d0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  t is closed..*/.
89e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
89f0: 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  Open(.  const ch
8a00: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
8a10: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
8a20: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
8a30: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
8a40: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
8a50: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
8a60: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
8a70: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
8a80: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
8a90: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
8aa0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
8ab0: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
8ac0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
8ad0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
8ae0: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
8af0: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
8b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
8b10: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
8b20: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
8b30: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
8b40: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
8b50: 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Vfs;      /* The
8b60: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
8b70: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
8b80: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
8b90: 30 3b 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65  0;      /* Share
8ba0: 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
8bb0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
8bc0: 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
8bd0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
8be0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
8bf0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8c00: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72  OK;.  int nReser
8c10: 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ve;.  unsigned c
8c20: 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
8c30: 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  0];..  /* Set th
8c40: 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
8c50: 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
8c60: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
8c70: 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
8c80: 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
8c90: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20  based database. 
8ca0: 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f  This symbol is o
8cb0: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a  nly required if.
8cc0: 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74    ** either of t
8cd0: 68 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f  he shared-data o
8ce0: 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61  r autovacuum fea
8cf0: 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c  tures are compil
8d00: 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  ed .  ** into th
8d10: 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a  e library..  */.
8d20: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8d30: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
8d40: 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e  CACHE) || !defin
8d50: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
8d60: 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66  UTOVACUUM).  #if
8d70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8d80: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e  MEMORYDB.    con
8d90: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
8da0: 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20   0;.  #else.    
8db0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
8dc0: 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  b = zFilename &&
8dd0: 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61   !strcmp(zFilena
8de0: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b  me, ":memory:");
8df0: 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  .  #endif.#endif
8e00: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
8e10: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8e20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8e30: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
8e40: 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  .  pVfs = db->pV
8e50: 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  fs;.  p = sqlite
8e60: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
8e70: 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
8e80: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
8e90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8ea0: 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
8eb0: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
8ec0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23    p->db = db;..#
8ed0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8ee0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
8ef0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
8f00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
8f10: 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
8f20: 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
8f30: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
8f40: 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
8f50: 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
8f60: 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
8f70: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
8f80: 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
8f90: 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 66  th.  */.  if( (f
8fa0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 50 52 49  lags & BTREE_PRI
8fb0: 56 41 54 45 29 3d 3d 30 0a 20 20 20 26 26 20 69  VATE)==0.   && i
8fc0: 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26 26 20  sMemdb==0.   && 
8fd0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8fe0: 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a 20 20 20  ITE_Vtab)==0.   
8ff0: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  && zFilename && 
9000: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20 20 29  zFilename[0].  )
9010: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
9020: 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  3SharedCacheEnab
9030: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
9040: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
9050: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
9060: 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
9070: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
9080: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
9090: 5f 6d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  _malloc(nFullPat
90a0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
90b0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
90c0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
90d0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
90e0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 20 29 7b  .      if( db ){
90f0: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
9100: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61  gs |= SQLITE_Sha
9110: 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20  redCache;.      
9120: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  }.      if( !zFu
9130: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
9140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9150: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
9160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9170: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
9180: 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50    sqlite3OsFullP
9190: 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
91a0: 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61  ilename, nFullPa
91b0: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
91c0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75  hname);.      mu
91d0: 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
91e0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
91f0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
9200: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
9210: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9220: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
9230: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
9240: 42 74 3d 73 71 6c 69 74 65 33 53 68 61 72 65 64  Bt=sqlite3Shared
9250: 43 61 63 68 65 4c 69 73 74 3b 20 70 42 74 3b 20  CacheList; pBt; 
9260: 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
9270: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9280: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
9290: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
92a0: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
92b0: 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
92c0: 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
92d0: 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
92e0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
92f0: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
9300: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
9310: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
9320: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
9330: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
9340: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
9350: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9360: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9370: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
9380: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
9390: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
93a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
93b0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
93c0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
93d0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
93e0: 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
93f0: 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
9400: 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
9410: 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
9420: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
9430: 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
9440: 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
9450: 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
9460: 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
9470: 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
9480: 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
9490: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
94a0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
94b0: 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
94c0: 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
94d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
94e0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
94f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
9500: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
9510: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
9520: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
9530: 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
9540: 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
9550: 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
9560: 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
9570: 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
9580: 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
9590: 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
95a0: 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
95b0: 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
95c0: 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
95d0: 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
95e0: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
95f0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9600: 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
9610: 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
9620: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9630: 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (u64)==8 || size
9640: 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(u64)==4 );.  
9650: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9660: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
9670: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
9680: 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
9690: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
96a0: 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
96b0: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
96c0: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
96d0: 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
96e0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
96f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
9700: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  EM;.      goto b
9710: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
9720: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 62 75     }.    pBt->bu
9730: 73 79 48 64 72 2e 78 46 75 6e 63 20 3d 20 73 71  syHdr.xFunc = sq
9740: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
9750: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
9760: 20 70 42 74 2d 3e 62 75 73 79 48 64 72 2e 70 41   pBt->busyHdr.pA
9770: 72 67 20 3d 20 70 42 74 3b 0a 20 20 20 20 72 63  rg = pBt;.    rc
9780: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
9790: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
97a0: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
97b0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
97d0: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
97e0: 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  vfsFlags);.    i
97f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9800: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9810: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
9820: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
9830: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
9840: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
9850: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
9860: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9870: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
9880: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
9890: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
98a0: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
98b0: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
98c0: 26 70 42 74 2d 3e 62 75 73 79 48 64 72 29 3b 0a  &pBt->busyHdr);.
98d0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
98e0: 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  ;.  .    sqlite3
98f0: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
9900: 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  or(pBt->pPager, 
9910: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b  pageDestructor);
9920: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9930: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
9940: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
9950: 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e  init);.    pBt->
9960: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
9970: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
9980: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
9990: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
99a0: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
99b0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
99c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67  Bt->pageSize = g
99d0: 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64  et2byte(&zDbHead
99e0: 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  er[16]);.    if(
99f0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
9a00: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
9a10: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
9a20: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
9a30: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
9a40: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
9a50: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
9a60: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
9a70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
9a80: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
9a90: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
9aa0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
9ab0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 61 78  ;.      pBt->max
9ac0: 45 6d 62 65 64 46 72 61 63 20 3d 20 36 34 3b 20  EmbedFrac = 64; 
9ad0: 20 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20 20 20    /* 25% */.    
9ae0: 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46    pBt->minEmbedF
9af0: 72 61 63 20 3d 20 33 32 3b 20 20 20 2f 2a 20 31  rac = 32;   /* 1
9b00: 32 2e 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42  2.5% */.      pB
9b10: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d  t->minLeafFrac =
9b20: 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e 35 25   32;    /* 12.5%
9b30: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
9b40: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9b50: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
9b60: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
9b70: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
9b80: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
9b90: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
9ba0: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
9bb0: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
9bc0: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
9bd0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
9be0: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
9bf0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
9c00: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
9c10: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
9c20: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
9c30: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
9c40: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
9c50: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
9c60: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
9c70: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
9c80: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
9c90: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
9ca0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
9cb0: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
9cc0: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
9cd0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
9ce0: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
9cf0: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
9d00: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
9d10: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
9d20: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
9d30: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
9d40: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
9d50: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
9d60: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
9d70: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
9d80: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
9d90: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
9da0: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
9db0: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
9dc0: 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65      pBt->maxEmbe
9dd0: 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65  dFrac = zDbHeade
9de0: 72 5b 32 31 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[21];.      pBt
9df0: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
9e00: 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d 3b 0a   zDbHeader[22];.
9e10: 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65        pBt->minLe
9e20: 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64  afFrac = zDbHead
9e30: 65 72 5b 32 33 5d 3b 0a 20 20 20 20 20 20 70 42  er[23];.      pB
9e40: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
9e50: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
9e60: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9e70: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
9e80: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
9e90: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
9ea0: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
9eb0: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
9ec0: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
9ed0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
9ee0: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
9ef0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
9f00: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
9f10: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
9f20: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
9f30: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
9f40: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
9f50: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
9f60: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
9f70: 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  Size */.    sqli
9f80: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
9f90: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
9fa0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
9fb0: 3b 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ;.   .#if !defin
9fc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
9fd0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
9fe0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9ff0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
a000: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
a010: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
a020: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
a030: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
a040: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
a050: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
a060: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
a070: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
a080: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74  hared;.      pBt
a090: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
a0a0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
a0b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
a0c0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a0d0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
a0e0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
a0f0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
a100: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
a110: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
a120: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
a130: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
a140: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
a150: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
a160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a170: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
a180: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a190: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
a1a0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
a1b0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a1d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a1e0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
a1f0: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
a200: 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64   = sqlite3Shared
a210: 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20  CacheList;.     
a220: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
a230: 63 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20  cheList = pBt;. 
a240: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
a250: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
a260: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
a270: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
a280: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a290: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
a2a0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a2b0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
a2c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
a2d0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
a2e0: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
a2f0: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
a300: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
a310: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
a320: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
a330: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
a340: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
a350: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
a360: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
a370: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
a380: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
a390: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
a3a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
a3b0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
a3c0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a3d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
a3e0: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
a3f0: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
a400: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
a410: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
a420: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
a430: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
a440: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
a450: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
a460: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
a470: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
a480: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
a490: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
a4a0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
a4b0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
a4c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
a4d0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
a4e0: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
a4f0: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
a500: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
a510: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
a520: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a530: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
a540: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
a550: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
a560: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
a570: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
a580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
a590: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
a5a0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
a5b0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
a5c0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
a5d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
a5e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
a5f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
a600: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
a610: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
a620: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a630: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
a640: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
a650: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
a660: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
a670: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
a680: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a690: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
a6a0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
a6b0: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
a6c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a6d0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
a6e0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
a6f0: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
a700: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
a710: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
a720: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
a730: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
a740: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
a750: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
a760: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
a770: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
a780: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
a790: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
a7a0: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
a7b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
a7c0: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
a7d0: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
a7e0: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
a7f0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
a800: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
a810: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
a820: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
a830: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
a840: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
a850: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
a860: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
a870: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
a880: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
a890: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
a8a0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
a8b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
a8c0: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
a8d0: 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
a8e0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
a8f0: 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
a900: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a910: 68 65 4c 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20  heList==pBt ){. 
a920: 20 20 20 20 20 73 71 6c 69 74 65 33 53 68 61 72       sqlite3Shar
a930: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42  edCacheList = pB
a940: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
a950: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
a960: 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64   = sqlite3Shared
a970: 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20  CacheList;.     
a980: 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
a990: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
a9a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
a9b0: 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
a9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a9d0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
a9e0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
a9f0: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
aa00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aa10: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
aa20: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
aa30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
aa40: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
aa50: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
aa60: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
aa70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
aa80: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
aa90: 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
aaa0: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
aab0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
aac0: 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
aad0: 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
aae0: 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
aaf0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ab00: 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
ab10: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
ab20: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
ab30: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
ab40: 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
ab50: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
ab60: 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
ab70: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
ab80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ab90: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
aba0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
abb0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
abc0: 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
abd0: 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
abe0: 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
abf0: 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
ac00: 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
ac10: 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
ac20: 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
ac30: 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
ac40: 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
ac50: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
ac60: 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
ac70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
ac80: 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
ac90: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
aca0: 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
acb0: 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
acc0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
acd0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
ace0: 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
acf0: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
ad00: 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
ad10: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
ad20: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29  BtreeRollback(p)
ad30: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
ad40: 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
ad50: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
ad60: 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
ad70: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
ad80: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
ad90: 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
ada0: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
adb0: 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
adc0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
add0: 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
ade0: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
adf0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ae00: 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
ae10: 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
ae20: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
ae30: 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
ae40: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
ae50: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
ae60: 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
ae70: 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
ae80: 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
ae90: 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
aea0: 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
aeb0: 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
aec0: 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
aed0: 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
aee0: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
aef0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
af00: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
af10: 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
af20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
af30: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
af40: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
af50: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
af60: 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
af70: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
af80: 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
af90: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
afa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
afb0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
afc0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
afd0: 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
afe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
aff0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
b000: 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
b010: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
b020: 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
b030: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
b040: 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
b050: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
b060: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
b070: 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
b080: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
b090: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
b0a0: 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
b0b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b0c0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b0d0: 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
b0e0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
b0f0: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
b100: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
b110: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
b120: 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
b130: 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
b140: 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
b150: 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
b160: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
b170: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
b180: 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
b190: 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
b1a0: 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
b1b0: 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
b1c0: 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
b1d0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
b1e0: 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
b1f0: 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
b200: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
b210: 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
b220: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
b230: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
b240: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
b250: 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
b260: 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
b270: 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
b280: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
b290: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
b2a0: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
b2b0: 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
b2c0: 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
b2d0: 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
b2e0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
b2f0: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
b300: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
b310: 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
b320: 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
b330: 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
b340: 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
b350: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
b360: 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
b370: 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
b380: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
b390: 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
b3a0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
b3b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b3c0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
b3d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b3e0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
b3f0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
b400: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
b410: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
b420: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
b430: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
b440: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b450: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
b460: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b470: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
b480: 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
b490: 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
b4a0: 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
b4b0: 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
b4c0: 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
b4d0: 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
b4e0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
b4f0: 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
b500: 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
b510: 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
b520: 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
b530: 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
b540: 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
b550: 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
b560: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
b570: 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
b580: 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
b590: 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
b5a0: 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
b5b0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
b5c0: 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
b5d0: 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
b5e0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
b5f0: 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
b600: 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
b610: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
b620: 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
b630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b640: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
b650: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
b660: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72  tSafetyLevel(Btr
b670: 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c  ee *p, int level
b680: 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b  , int fullSync){
b690: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b6a0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
b6b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b6c0: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
b6d0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
b6e0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
b6f0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
b700: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
b710: 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
b720: 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73  , fullSync);.  s
b730: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
b740: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
b750: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
b760: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
b770: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
b780: 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
b790: 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
b7a0: 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
b7b0: 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
b7c0: 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
b7d0: 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
b7e0: 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
b7f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
b800: 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
b810: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
b820: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
b830: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
b840: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b850: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
b860: 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
b870: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
b880: 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
b890: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
b8a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
b8b0: 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
b8c0: 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
b8d0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
b8e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b8f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b900: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
b910: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
b920: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b930: 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68  VACUUM)./*.** Ch
b940: 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
b950: 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
b960: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
b970: 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
b980: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
b990: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
b9a0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
b9b0: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
b9c0: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
b9d0: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
b9e0: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
b9f0: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
ba00: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
ba10: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
ba20: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
ba30: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
ba40: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
ba50: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
ba60: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
ba70: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
ba80: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
ba90: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
baa0: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
bab0: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
bac0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
bad0: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
bae0: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
baf0: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
bb00: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
bb10: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
bb20: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
bb30: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
bb40: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
bb50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
bb60: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
bb70: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
bb80: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
bb90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
bba0: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
bbb0: 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
bbc0: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
bbd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bbe0: 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
bbf0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
bc00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
bc10: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
bc20: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
bc30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bc40: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
bc50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bc60: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
bc70: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
bc80: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
bc90: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
bca0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
bcb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65  ;.  }.  if( page
bcc0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
bcd0: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
bce0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
bcf0: 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
bd00: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
bd10: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
bd20: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
bd30: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
bd40: 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
bd50: 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
bd60: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
bd70: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
bd80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
bd90: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
bda0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
bdb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
bdc0: 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c    }.  pBt->usabl
bdd0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
bde0: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
bdf0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
be00: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
be10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
be20: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
be30: 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
be40: 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
be50: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
be60: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
be70: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
be80: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e  ->pageSize;.}.in
be90: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
bea0: 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
beb0: 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
bec0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
bed0: 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
bee0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
bef0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
bf00: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bf10: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
bf20: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
bf30: 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
bf40: 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
bf50: 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
bf60: 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
bf70: 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
bf80: 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
bf90: 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
bfa0: 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
bfb0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
bfc0: 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
bfd0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
bfe0: 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
bff0: 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
c000: 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
c010: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
c020: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
c030: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c040: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
c050: 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
c060: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
c070: 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
c080: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
c090: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65    return n;.}.#e
c0a0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
c0b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
c0c0: 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
c0d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c0e0: 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
c0f0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
c100: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
c110: 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
c120: 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
c130: 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
c140: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
c150: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
c160: 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
c170: 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
c180: 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
c190: 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
c1a0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
c1b0: 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
c1c0: 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
c1d0: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
c1e0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
c1f0: 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
c200: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
c210: 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
c220: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
c230: 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
c240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c250: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
c260: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
c270: 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
c280: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
c290: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
c2a0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61 76  ITE_OK;.  int av
c2b0: 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f 31   = (autoVacuum?1
c2c0: 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  :0);..  sqlite3B
c2d0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
c2e0: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
c2f0: 65 46 69 78 65 64 20 26 26 20 61 76 21 3d 70 42  eFixed && av!=pB
c300: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
c310: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c320: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
c330: 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
c340: 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20  oVacuum = av;.  
c350: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
c360: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
c370: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
c380: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c390: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
c3a0: 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
c3b0: 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
c3c0: 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
c3d0: 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
c3e0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
c3f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c400: 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
c410: 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
c420: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c430: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
c440: 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
c450: 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
c460: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
c470: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
c480: 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
c490: 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
c4a0: 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
c4b0: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
c4c0: 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
c4d0: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
c4e0: 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
c4f0: 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
c500: 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
c510: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c520: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c530: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
c540: 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
c550: 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
c560: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c570: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
c580: 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
c590: 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
c5a0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
c5b0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
c5c0: 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
c5d0: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
c5e0: 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
c5f0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
c600: 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
c610: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
c620: 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
c630: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
c640: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
c650: 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
c660: 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
c670: 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
c680: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
c690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
c6a0: 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
c6b0: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
c6c0: 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
c6d0: 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  age1;..  assert(
c6e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c6f0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c700: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  );.  if( pBt->pP
c710: 61 67 65 31 20 29 20 72 65 74 75 72 6e 20 53 51  age1 ) return SQ
c720: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20  LITE_OK;.  rc = 
c730: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
c740: 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
c750: 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
c760: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
c770: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
c780: 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
c790: 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
c7a0: 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
c7b0: 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
c7c0: 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
c7d0: 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
c7e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
c7f0: 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ADB;.  if( sqlit
c800: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
c810: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20  (pBt->pPager)>0 
c820: 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
c830: 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
c840: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
c850: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
c860: 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  >aData;.    if( 
c870: 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
c880: 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
c890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
c8a0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
c8b0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
c8c0: 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
c8d0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64  .      pBt->read
c8e0: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Only = 1;.    }.
c8f0: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
c900: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
c910: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
c920: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
c930: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
c940: 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a  te(&page1[16]);.
c950: 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
c960: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
c970: 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35  =0 || pageSize<5
c980: 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53  12 ||.        (S
c990: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
c9a0: 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67  IZE<32768 && pag
c9b0: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
c9c0: 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20  _PAGE_SIZE).    
c9d0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
c9e0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
c9f0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
ca00: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
ca10: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62  )==0 );.    usab
ca20: 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
ca30: 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
ca40: 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21     if( pageSize!
ca50: 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
ca60: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
ca70: 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
ca80: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
ca90: 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
caa0: 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
cab0: 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
cac0: 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
cad0: 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
cae0: 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
caf0: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
cb00: 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
cb10: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
cb20: 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
cb30: 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
cb40: 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
cb50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
cb60: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
cb70: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
cb80: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
cb90: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
cba0: 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
cbb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
cbc0: 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
cbd0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
cbe0: 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
cbf0: 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
cc00: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
cc10: 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
cc20: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
cc30: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
cc40: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
cc50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
cc60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
cc70: 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
cc80: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
cc90: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
cca0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
ccb0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
ccc0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
ccd0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
cce0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
ccf0: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
cd00: 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a  ac = page1[21];.
cd10: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
cd20: 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32  dFrac = page1[22
cd30: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
cd40: 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b  eafFrac = page1[
cd50: 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  23];.#ifndef SQL
cd60: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
cd70: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
cd80: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
cd90: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
cda0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
cdb0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
cdc0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
cdd0: 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
cde0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
cdf0: 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
ce00: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
ce10: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
ce20: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
ce30: 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
ce40: 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
ce50: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
ce60: 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
ce70: 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
ce80: 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
ce90: 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
cea0: 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
ceb0: 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
cec0: 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
ced0: 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
cee0: 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
cef0: 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
cf00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
cf10: 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
cf20: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
cf30: 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
cf40: 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
cf50: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
cf60: 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
cf70: 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
cf80: 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
cf90: 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
cfa0: 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
cfb0: 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
cfc0: 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
cfd0: 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
cfe0: 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
cff0: 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
d000: 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
d010: 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
d020: 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
d030: 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
d040: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
d050: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
d060: 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65  12)*pBt->maxEmbe
d070: 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
d080: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
d090: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
d0a0: 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45  ze-12)*pBt->minE
d0b0: 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32  mbedFrac/255 - 2
d0c0: 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  3;.  pBt->maxLea
d0d0: 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  f = pBt->usableS
d0e0: 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d  ize - 35;.  pBt-
d0f0: 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d  >minLeaf = (pBt-
d100: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
d110: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
d120: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28  /255 - 23;.  if(
d130: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70   pBt->minLocal>p
d140: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20  Bt->maxLocal || 
d150: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20  pBt->maxLocal<0 
d160: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
d170: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
d180: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
d190: 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
d1a0: 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
d1b0: 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
d1c0: 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
d1d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d1e0: 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
d1f0: 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
d200: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
d210: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
d220: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d230: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d240: 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c  ine works like l
d250: 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70  ockBtree() excep
d260: 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69  t that it also i
d270: 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75  nvokes the.** bu
d280: 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
d290: 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e  here is lock con
d2a0: 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  tention..*/.stat
d2b0: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
d2c0: 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20  WithRetry(Btree 
d2d0: 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pRef){.  int rc
d2e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
d2f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d300: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
d310: 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70  pRef) );.  if( p
d320: 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  Ref->inTrans==TR
d330: 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
d340: 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  u8 inTransaction
d350: 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e   = pRef->pBt->in
d360: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
d370: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
d380: 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  pRef);.    rc = 
d390: 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
d3a0: 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b  nTrans(pRef, 0);
d3b0: 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e  .    pRef->pBt->
d3c0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
d3d0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
d3e0: 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73     pRef->inTrans
d3f0: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
d400: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d410: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52  E_OK ){.      pR
d420: 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61  ef->pBt->nTransa
d430: 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ction--;.    }. 
d440: 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
d450: 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72  y(pRef);.  }.  r
d460: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20  eturn rc;.}.    
d470: 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68     ../*.** If th
d480: 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
d490: 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
d4a0: 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
d4b0: 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
d4c0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
d4d0: 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
d4e0: 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
d4f0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
d500: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
d510: 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
d520: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
d530: 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
d540: 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
d550: 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
d560: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
d570: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
d580: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
d590: 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20  g cursors, this 
d5a0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
d5b0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
d5c0: 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
d5d0: 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
d5e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d5f0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
d600: 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
d610: 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
d620: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
d630: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d640: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d650: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
d660: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
d670: 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
d680: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
d690: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
d6a0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
d6b0: 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
d6c0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e  nt(pBt->pPager)>
d6d0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =1 ){.      asse
d6e0: 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
d6f0: 3e 61 44 61 74 61 20 29 3b 0a 23 69 66 20 30 0a  >aData );.#if 0.
d700: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70        if( pBt->p
d710: 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20  Page1->aData==0 
d720: 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
d730: 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74 2d  ge *pPage = pBt-
d740: 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20  >pPage1;.       
d750: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
d760: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
d770: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
d780: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ge);.        pPa
d790: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
d7a0: 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67         pPage->pg
d7b0: 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  no = 1;.      }.
d7c0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 6c  #endif.      rel
d7d0: 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
d7e0: 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
d7f0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
d800: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
d810: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
d820: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
d830: 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
d840: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
d850: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
d860: 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
d870: 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
d880: 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
d890: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
d8a0: 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
d8b0: 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
d8c0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
d8d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d8e0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d8f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61  .  if( sqlite3Pa
d900: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
d910: 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65  ->pPager)>0 ) re
d920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d930: 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
d940: 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
d950: 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
d960: 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
d970: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
d980: 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
d990: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
d9a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
d9b0: 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
d9c0: 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
d9d0: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
d9e0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
d9f0: 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
da00: 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  16 );.  put2byte
da10: 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d  (&data[16], pBt-
da20: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
da30: 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
da40: 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[19] = 1;.  da
da50: 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61  ta[20] = pBt->pa
da60: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
da70: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61  ableSize;.  data
da80: 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45  [21] = pBt->maxE
da90: 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61  mbedFrac;.  data
daa0: 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45  [22] = pBt->minE
dab0: 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61  mbedFrac;.  data
dac0: 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  [23] = pBt->minL
dad0: 65 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65  eafFrac;.  memse
dae0: 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
daf0: 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
db00: 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
db10: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
db20: 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
db30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
db40: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
db50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
db60: 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
db70: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
db80: 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
db90: 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
dba0: 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
dbb0: 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
dbc0: 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
dbd0: 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
dbe0: 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
dbf0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
dc00: 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
dc10: 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
dc20: 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
dc30: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
dc40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
dc50: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
dc60: 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
dc70: 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
dc80: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
dc90: 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
dca0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
dcb0: 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
dcc0: 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
dcd0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
dce0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
dcf0: 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
dd00: 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
dd10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
dd20: 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
dd30: 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
dd40: 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
dd50: 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
dd60: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
dd70: 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
dd80: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
dd90: 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
dda0: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
ddb0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
ddc0: 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
ddd0: 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
dde0: 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
ddf0: 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
de00: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
de10: 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
de20: 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
de30: 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
de40: 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
de50: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
de60: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
de70: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
de80: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
de90: 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
dea0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
deb0: 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
dec0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
ded0: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
dee0: 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
def0: 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
df00: 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
df10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
df20: 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
df30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
df40: 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
df50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
df60: 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
df70: 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
df80: 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
df90: 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
dfa0: 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
dfb0: 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
dfc0: 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
dfd0: 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
dfe0: 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
dff0: 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
e000: 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
e010: 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
e020: 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
e030: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
e040: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
e050: 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
e060: 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
e070: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
e080: 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
e090: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
e0a0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
e0b0: 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
e0c0: 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
e0d0: 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
e0e0: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
e0f0: 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
e100: 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
e110: 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
e120: 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
e130: 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
e140: 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
e150: 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
e160: 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
e170: 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
e180: 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
e190: 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
e1a0: 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
e1b0: 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
e1c0: 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
e1d0: 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
e1e0: 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
e1f0: 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
e200: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
e210: 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
e220: 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
e230: 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
e240: 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
e250: 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
e260: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
e270: 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
e280: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
e290: 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
e2a0: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
e2b0: 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
e2c0: 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
e2d0: 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
e2e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
e2f0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
e300: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
e310: 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  lag){.  BtShared
e320: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
e330: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e340: 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
e350: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
e360: 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
e370: 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
e380: 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
e390: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
e3a0: 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
e3b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
e3c0: 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
e3d0: 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
e3e0: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
e3f0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
e400: 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
e410: 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
e420: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
e430: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
e440: 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
e450: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
e460: 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
e470: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
e480: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
e490: 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
e4a0: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
e4b0: 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
e4c0: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
e4d0: 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
e4e0: 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
e4f0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
e500: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
e510: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
e520: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
e530: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
e540: 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
e550: 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
e560: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
e570: 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
e580: 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
e590: 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
e5a0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e5b0: 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
e5c0: 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
e5d0: 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  E_BUSY..  */.  i
e5e0: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
e5f0: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
e600: 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  TE && wrflag ){.
e610: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e620: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  BUSY;.    goto t
e630: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
e640: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e650: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e660: 45 0a 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31  E.  if( wrflag>1
e670: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
e680: 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
e690: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
e6a0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
e6b0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
e6c0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
e6d0: 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
e6e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
e6f0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  USY;.        got
e700: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
e710: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e720: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a  .#endif..  do {.
e730: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
e740: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 42 74 2d  QLITE_OK && pBt-
e750: 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
e760: 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72      rc = lockBtr
e770: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 0a  ee(pBt);.    }..
e780: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e790: 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
e7a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  ){.      if( pBt
e7b0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
e7c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e7d0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
e7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e7f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e800: 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
e810: 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72  ge1->pDbPage, wr
e820: 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
e830: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e840: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
e850: 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
e860: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
e870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e880: 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
e890: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e8a0: 20 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42   if( wrflag ) pB
e8b0: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
e8c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e8d0: 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
e8e0: 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
e8f0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
e900: 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
e910: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
e920: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
e930: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e940: 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  BtreeInvokeBusyH
e950: 61 6e 64 6c 65 72 28 70 42 74 2c 20 30 29 20 29  andler(pBt, 0) )
e960: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
e970: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
e980: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
e990: 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
e9a0: 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
e9b0: 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ion++;.    }.   
e9c0: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
e9d0: 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
e9e0: 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
e9f0: 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
ea00: 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
ea10: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
ea20: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
ea30: 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
ea40: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ea50: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ea60: 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72  CACHE.    if( wr
ea70: 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  flag>1 ){.      
ea80: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45  assert( !pBt->pE
ea90: 78 63 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20  xclusive );.    
eaa0: 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76    pBt->pExclusiv
eab0: 65 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = p;.    }.#en
eac0: 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f  dif.  }...trans_
ead0: 62 65 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e  begun:.  btreeIn
eae0: 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
eaf0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
eb00: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
eb10: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
eb20: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
eb30: 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
eb40: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
eb50: 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
eb60: 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
eb70: 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
eb80: 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
eb90: 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
eba0: 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
ebb0: 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
ebc0: 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
ebd0: 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
ebe0: 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
ebf0: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
ec00: 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
ec10: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
ec20: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
ec50: 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
ec60: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ec90: 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
eca0: 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
ecb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecd0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
ece0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
ecf0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
ed00: 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
ed10: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
ed20: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
ed30: 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
ed40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ed50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
ed60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
ed70: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
ed80: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
ed90: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
eda0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
edb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
edc0: 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
edd0: 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
ede0: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
edf0: 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
ee00: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
ee10: 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
ee20: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
ee30: 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74  i);..    rc = pt
ee40: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
ee50: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
ee60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ee70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
ee80: 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
ee90: 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  aps_out;.    }..
eea0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
eeb0: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
eec0: 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
eed0: 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
eee0: 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
eef0: 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
ef00: 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
ef10: 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  E, pgno);.      
ef20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ef30: 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69  K ) goto set_chi
ef40: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
ef50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
ef60: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
ef70: 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
ef80: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
ef90: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
efa0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
efb0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  );.    rc = ptrm
efc0: 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
efd0: 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
efe0: 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  EE, pgno);.  }..
eff0: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f000: 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
f010: 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
f020: 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
f030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
f040: 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77  here on pPage, w
f050: 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65  hich is guarente
f060: 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65  ed to be a btree
f070: 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76   page, not an ov
f080: 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20  erflow.** page, 
f090: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f0a0: 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69  page iFrom. Modi
f0b0: 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
f0c0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
f0d0: 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72  s to.** iTo. Par
f0e0: 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
f0f0: 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
f100: 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65  of pointer to be
f110: 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a   modified, as .*
f120: 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  * follows:.**.**
f130: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
f140: 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
f150: 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
f160: 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
f170: 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
f190: 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
f1a0: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
f1b0: 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
f1c0: 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
f1d0: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
f1e0: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
f210: 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
f220: 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
f230: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
f240: 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
f250: 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
f260: 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
f270: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
f280: 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
f290: 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
f2a0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
f2b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f2c0: 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
f2d0: 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
f2e0: 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
f2f0: 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
f300: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
f310: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f320: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
f330: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ex) );.  if( eTy
f340: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
f350: 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
f360: 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
f370: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
f380: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
f390: 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
f3a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
f3b0: 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
f3c0: 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
f3d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f3e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f3f0: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
f400: 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
f410: 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
f420: 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72      int isInitOr
f430: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
f440: 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
f450: 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
f460: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
f470: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
f480: 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
f490: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
f4a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
f4b0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f4c0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
f4d0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
f4e0: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
f4f0: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
f500: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
f510: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
f520: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f530: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
f540: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
f550: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
f560: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
f570: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
f580: 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
f590: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
f5a0: 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20  flow]) ){.      
f5b0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
f5c0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
f5d0: 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
f5e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f5f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f600: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f610: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
f620: 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
f630: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
f640: 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
f650: 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
f660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f670: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f680: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
f690: 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
f6a0: 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
f6b0: 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
f6c0: 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
f6d0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
f6e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
f6f0: 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
f700: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f710: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
f730: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
f740: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
f750: 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
f760: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
f770: 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
f780: 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
f790: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f7a0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
f7b0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
f7c0: 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
f7d0: 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
f7e0: 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
f7f0: 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
f800: 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
f810: 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
f820: 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
f830: 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
f840: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
f850: 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
f860: 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
f870: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
f880: 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
f890: 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8b0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
f8c0: 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
f8d0: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
f8e0: 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
f8f0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
f900: 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
f910: 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
f920: 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
f930: 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e           /* T
f940: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
f950: 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
f960: 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
f970: 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
f980: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
f990: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
f9a0: 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
f9b0: 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
f9c0: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
f9d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
f9e0: 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
f9f0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
fa00: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
fa10: 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
fa20: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
fa30: 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
fa40: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
fa50: 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
fa60: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
fa70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fa80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
fa90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
faa0: 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
fab0: 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
fac0: 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
fad0: 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
fae0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
faf0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
fb00: 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
fb10: 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
fb20: 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
fb30: 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
fb40: 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
fb50: 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
fb60: 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
fb70: 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
fb80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
fb90: 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
fba0: 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
fbb0: 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
fbc0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
fbd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
fbe0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
fbf0: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
fc00: 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
fc10: 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
fc20: 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
fc30: 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
fc40: 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
fc50: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
fc60: 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
fc70: 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
fc80: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
fc90: 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
fca0: 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
fcb0: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
fcc0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
fcd0: 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
fce0: 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
fcf0: 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
fd00: 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
fd10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
fd20: 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
fd30: 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
fd40: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
fd50: 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
fd60: 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
fd70: 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
fd80: 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
fd90: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
fda0: 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
fdb0: 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
fdc0: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
fdd0: 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
fde0: 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
fdf0: 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
fe00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fe10: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
fe20: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
fe30: 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
fe40: 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
fe50: 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
fe60: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
fe70: 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
fe80: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
fe90: 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
fea0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
feb0: 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
fec0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fed0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
fee0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
fef0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
ff00: 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
ff10: 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
ff20: 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
ff30: 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
ff40: 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
ff50: 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
ff60: 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
ff70: 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
ff80: 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
ff90: 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
ffa0: 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
ffb0: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
ffc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ffd0: 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
ffe0: 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
fff0: 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
10000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10010 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10020 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
10030 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10040 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
10050 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
10060 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10070 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
10080 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
10090 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
100a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
100b0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
100c0 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
100d0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
100e0 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
100f0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
10100 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
10110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10120 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
10130 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
10140 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
10150 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
10160 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
10170 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
10180 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
10190 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
101a0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
101b0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
101c0 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
101d0 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
101e0 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
101f0 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
10200 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
10210 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
10220 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
10230 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  l,.** return SQL
10240 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
10250 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
10260 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
10270 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20   no.** point in 
10280 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
10290 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
102a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
102b0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
102c0 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75  cificly, this fu
102d0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
102e0 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
102f0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
10300 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  so that the last
10310 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
10320 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
10330 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  se.** is no long
10340 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
10350 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72   If the nFin par
10360 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
10370 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ro, the implemen
10380 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a  tation assumes.*
10390 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  * that the calle
103a0 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
103b0 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
103c0 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74  ep() until.** it
103d0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
103e0 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72  DONE or an error
103f0 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20  , and that nFin 
10400 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
10410 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61   of pages the da
10420 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
10430 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74   contain after t
10440 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20  his .** process 
10450 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a  is complete..*/.
10460 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
10470 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
10480 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
10490 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73  in){.  Pgno iLas
104a0 74 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  tPg;            
104b0 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e   /* Last page in
104c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
104d0 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
104e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
104f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
10500 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
10510 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
10520 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10530 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
10540 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67  ex) );.  iLastPg
10550 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
10560 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30    if( iLastPg==0
10570 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20   ){.    iLastPg 
10580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
10590 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
105a0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
105b0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
105c0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
105d0 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
105e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
105f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
10600 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
10610 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
10620 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
10630 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
10640 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
10650 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
10660 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69  eeList==0 || nFi
10670 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20  n==iLastPg ){.  
10680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10690 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
106a0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
106b0 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
106c0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
106d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
106e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
106f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10700 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
10710 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
10720 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
10730 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10740 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
10750 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
10760 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
10770 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
10780 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
10790 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
107a0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
107b0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
107c0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
107d0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
107e0 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
107f0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
10800 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
10810 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
10820 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
10830 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
10840 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
10850 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
10860 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
10870 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
10880 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
10890 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
108a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
108b0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
108c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
108d0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
108e0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
108f0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
10900 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
10910 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
10920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10930 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
10940 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
10960 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
10970 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
10980 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
10990 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
109a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
109b0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
109d0 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
109e0 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
109f0 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
10a00 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
10a10 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
10a20 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
10a30 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
10a40 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
10a50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10a70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10a80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
10a90 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
10aa0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
10ab0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
10ac0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
10ad0 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
10ae0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
10af0 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
10b00 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
10b10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
10b20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
10b30 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
10b40 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
10b50 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
10b60 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
10b70 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
10b80 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
10b90 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
10ba0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
10bb0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
10bc0 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
10bd0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
10be0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
10bf0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
10c00 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
10c10 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
10c20 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
10c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
10c40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10c50 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
10c60 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
10c70 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10c80 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
10c90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
10ca0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
10cb0 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
10cc0 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
10cd0 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
10ce0 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
10cf0 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
10d00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10d10 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
10d20 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
10d30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10d50 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
10d60 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
10d70 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
10d80 20 69 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20   iFreePg);.     
10d90 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
10da0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
10db0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
10dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10de0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
10df0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
10e00 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77  iLastPg - 1;.  w
10e10 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e  hile( pBt->nTrun
10e20 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  c==PENDING_BYTE_
10e30 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
10e40 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
10e50 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20  t->nTrunc) ){.  
10e60 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b    pBt->nTrunc--;
10e70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10e80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10e90 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
10ea0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
10eb0 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
10ec0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
10ed0 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
10ee0 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
10ef0 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
10f00 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
10f10 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
10f20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
10f30 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
10f40 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
10f50 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
10f60 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
10f70 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
10f80 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
10f90 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
10fa0 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  occured,.** SQLI
10fb0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10fc0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
10fd0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
10fe0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
10ff0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
11000 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
11010 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
11020 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11030 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
11040 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
11050 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  >db = p->db;.  a
11060 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
11070 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11080 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
11090 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
110a0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
110b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
110c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
110d0 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
110e0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
110f0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
11100 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
11110 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
11120 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
11130 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11150 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11160 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
11170 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
11180 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
11190 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
111a0 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
111b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
111c0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
111d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
111e0 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
111f0 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
11200 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
11210 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
11220 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
11230 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
11240 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
11250 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
11260 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
11270 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
11280 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
11290 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
112a0 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
112b0 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
112c0 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
112d0 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
112e0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70  ed *pBt, Pgno *p
112f0 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
11300 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11310 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
11320 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69   pBt->pPager;.#i
11330 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
11340 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
11350 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
11360 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  Pager);.#endif..
11370 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11380 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11390 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
113a0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
113b0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
113c0 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
113d0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
113e0 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
113f0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
11400 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  n = 0;..    if( 
11410 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29  pBt->nTrunc==0 )
11420 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72  {.      Pgno nFr
11430 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e  ee;.      Pgno n
11440 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f  Ptrmap;.      co
11450 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  nst int pgsz = p
11460 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  Bt->pageSize;.  
11470 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
11480 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11490 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
114a0 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  er);..      if( 
114b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
114c0 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20  t, nOrig) ){.   
114d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
114e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
114f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11500 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  f( nOrig==PENDIN
11510 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
11520 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69   ){.        nOri
11530 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
11540 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
11550 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
11560 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
11570 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
11580 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
11590 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
115a0 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
115b0 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69  sz/5);.      nFi
115c0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
115d0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
115e0 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e     if( nOrig>PEN
115f0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
11600 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e  Bt) && nFin<=PEN
11610 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
11620 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
11630 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Fin--;.      }. 
11640 20 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d       while( PTRM
11650 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
11660 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
11670 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11680 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
11690 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nFin--;.      }.
116a0 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65      }..    while
116b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
116c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
116d0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
116e0 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
116f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11700 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
11710 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c  assert(nFin==0 |
11720 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  | pBt->nTrunc==0
11730 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e   || nFin<=pBt->n
11740 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63  Trunc);.      rc
11750 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11760 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
11770 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  unc ){.        r
11780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11790 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
117a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
117b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
117c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
117d0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
117e0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
117f0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11800 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  36], 0);.       
11810 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e   pBt->nTrunc = n
11820 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
11830 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
11840 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11850 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
11860 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11870 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
11880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11890 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d  {.    *pnTrunc =
118a0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
118b0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
118c0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
118d0 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
118e0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
118f0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
11900 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f  rc;.}..#endif../
11910 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11920 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
11930 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
11940 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
11950 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
11960 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
11970 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
11980 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
11990 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
119a0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
119b0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
119c0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
119d0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
119e0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
119f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
11a00 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
11a10 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
11a20 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
11a30 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
11a40 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
11a50 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
11a60 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
11a70 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
11a80 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
11a90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
11aa0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
11ab0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
11ac0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
11ad0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
11ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
11af0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
11b00 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
11b10 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
11b20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
11b30 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
11b40 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
11b50 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
11b60 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
11b70 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
11b80 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
11b90 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
11ba0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
11bb0 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65  Commit() for the
11bc0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
11bd0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
11be0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
11bf0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
11c00 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
11c10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
11c20 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
11c30 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
11c40 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
11c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
11c60 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
11c70 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
11c80 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
11c90 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
11ca0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
11cb0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
11cc0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
11cd0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
11ce0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
11cf0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
11d00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11d10 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
11d20 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
11d30 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
11d40 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
11d50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11d60 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
11d70 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
11d80 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
11d90 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
11da0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
11db0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
11dc0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
11dd0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
11de0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
11df0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
11e00 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
11e10 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
11e20 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
11e30 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
11e40 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
11e50 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
11e60 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
11e70 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
11e80 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
11e90 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
11ea0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11eb0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
11ec0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
11ed0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
11ee0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50   = p->pBt;.    P
11ef0 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  gno nTrunc = 0;.
11f00 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11f10 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42  Enter(p);.    pB
11f20 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23  t->db = p->db;.#
11f30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11f40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
11f50 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
11f60 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
11f70 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
11f80 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e  mmit(pBt, &nTrun
11f90 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72  c); .      if( r
11fa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
11fc0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11fd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
11ff0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
12000 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
12010 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
12020 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
12030 6e 54 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20  nTrunc, 0);.    
12040 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12050 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
12060 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12070 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
12080 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
12090 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
120a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
120b0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
120c0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
120d0 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
120e0 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
120f0 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75  3BtreeSync() rou
12100 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
12110 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
12120 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a  ould be invoked.
12130 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
12140 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
12150 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
12160 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e  reeSync() routin
12170 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65  e did.** all the
12180 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
12190 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
121a0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
121b0 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
121c0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
121d0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
121e0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
121f0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
12200 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
12210 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
12220 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 72  r truncate the r
12230 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
12240 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65 73  ** (which causes
12250 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12260 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20   to commit) and 
12270 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
12280 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
12290 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
122a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
122b0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
122c0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
122d0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
122e0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
122f0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
12300 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12310 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
12320 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
12330 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12340 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
12350 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
12360 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
12370 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
12380 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
12390 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
123a0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
123b0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
123c0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
123d0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
123e0 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
123f0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
12400 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
12410 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
12420 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
12430 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
12440 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
12450 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
12460 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
12470 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
12480 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
12490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
124a0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
124b0 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
124c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
124d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
124e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
124f0 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
12500 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
12510 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12520 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
12530 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
12540 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f   = 0;.  }.  unlo
12550 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a  ckAllTables(p);.
12560 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
12570 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64  dle has any kind
12580 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
12590 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
125a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
125b0 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68    ** count of th
125c0 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
125d0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
125e0 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  on count reaches
125f0 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65   0, set.  ** the
12600 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
12610 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
12620 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
12630 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f  used() call belo
12640 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f  w.  ** will unlo
12650 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  ck the pager..  
12660 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
12670 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
12680 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  ){.    pBt->nTra
12690 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
126a0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
126b0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
126c0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
126d0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
126e0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
126f0 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c  /* Set the handl
12700 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  es current trans
12710 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
12720 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
12730 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70  nlock.  ** the p
12740 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
12750 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
12760 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
12770 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
12780 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  /.  p->inTrans =
12790 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75   TRANS_NONE;.  u
127a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
127b0 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
127c0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
127d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
127e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
127f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12800 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
12810 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
12820 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12830 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
12840 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
12850 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12860 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
12870 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12880 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
12890 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
128a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
128b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
128c0 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20  itPhaseTwo(p);. 
128d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
128e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
128f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
12900 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
12910 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
12920 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f  r of write-curso
12930 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
12940 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
12950 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
12960 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
12970 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
12980 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
12990 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
129a0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  efined..**.** Fo
129b0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
129c0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
129d0 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
129e0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
129f0 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
12a00 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  of writing to th
12a10 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74  e databse.  That
12a20 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f   means the curso
12a30 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61  r was.** origina
12a40 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  lly opened for w
12a50 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63  riting and the c
12a60 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65  ursor has not be
12a70 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20   disabled.** by 
12a80 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65  having its state
12a90 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53   changed to CURS
12aa0 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61  OR_FAULT..*/.sta
12ab0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
12ac0 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
12ad0 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
12ae0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
12af0 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
12b00 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
12b10 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
12b20 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
12b30 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
12b40 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
12b50 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
12b60 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
12b70 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
12b80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12b90 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
12ba0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
12bb0 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
12bc0 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
12bd0 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
12be0 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
12bf0 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
12c00 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
12c10 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
12c20 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
12c30 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
12c40 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
12c50 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
12c60 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
12c70 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
12c80 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
12c90 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
12ca0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12cb0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
12cc0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
12cd0 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
12ce0 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
12cf0 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
12d00 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
12d10 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
12d20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
12d30 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
12d40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
12d50 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
12d60 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
12d70 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
12d80 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
12d90 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
12da0 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
12db0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
12dc0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
12dd0 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
12de0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
12df0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
12e00 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
12e10 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
12e20 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
12e30 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71  tCursor *p;.  sq
12e40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12e50 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70  pBtree);.  for(p
12e60 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
12e70 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
12e80 4e 65 78 74 29 7b 0a 20 20 20 20 63 6c 65 61 72  Next){.    clear
12e90 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
12ea0 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
12eb0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
12ec0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65  .    p->skip = e
12ed0 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71  rrCode;.  }.  sq
12ee0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12ef0 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pBtree);.}../*.*
12f00 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
12f10 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
12f20 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72  ogress.  All cur
12f30 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  sors will be.** 
12f40 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69  invalided by thi
12f50 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
12f60 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
12f70 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61   a cursor.** tha
12f80 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
12f90 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
12fa0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  his operation wi
12fb0 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
12fc0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
12fd0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
12fe0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
12ff0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13000 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
13010 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
13020 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
13030 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
13040 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
13050 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
13060 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29  llback(Btree *p)
13070 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
13080 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13090 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
130a0 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69  *pPage1;..  sqli
130b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
130c0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
130d0 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61 76 65  >db;.  rc = save
130e0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
130f0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
13100 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13110 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
13120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13130 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
13140 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
13150 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
13160 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
13170 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a  red whilst.    *
13180 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  * trying to save
13190 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
131a0 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  s. If this is an
131b0 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62   automatic rollb
131c0 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74  ack (as.    ** t
131d0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63  he result of a c
131e0 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f  onstraint, mallo
131f0 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49  c() failure or I
13200 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20  O error) then . 
13210 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20     ** the cache 
13220 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  may be internall
13230 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28  y inconsistent (
13240 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69  not contain vali
13250 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20  d trees) so.    
13260 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d  ** we cannot sim
13270 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65  ply return the e
13280 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rror to the call
13290 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f  er. Instead, abo
132a0 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71  rt .    ** all q
132b0 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
132c0 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20  be using any of 
132d0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
132e0 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e   failed to save.
132f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
13300 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
13310 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20  ursors(p, rc);. 
13320 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65   }.#endif.  btre
13330 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
13340 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
13350 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
13360 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
13370 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
13380 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  c2;..#ifndef SQL
13390 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
133a0 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72  UUM.    pBt->nTr
133b0 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unc = 0;.#endif.
133c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
133d0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
133e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
133f0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
13400 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
13410 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
13420 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
13430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
13440 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
13450 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
13460 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
13470 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
13480 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
13490 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71  o.    ** call sq
134a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
134b0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
134c0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
134d0 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
134e0 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
134f0 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
13500 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  f( sqlite3BtreeG
13510 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
13520 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
13530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13540 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
13550 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
13560 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
13570 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
13580 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
13590 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
135a0 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69  S_READ;.  }..  i
135b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
135c0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
135d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
135e0 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
135f0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
13600 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
13610 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
13620 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
13630 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13640 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
13650 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
13660 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
13670 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53  NONE;.  pBt->inS
13680 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63  tmt = 0;.  unloc
13690 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
136a0 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
136b0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
136c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
136d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
136e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
136f0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
13700 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20  ansaction.  The 
13710 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
13720 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  an.** can be rol
13730 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  led back indepen
13740 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
13750 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  in transaction..
13760 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  ** You must star
13770 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
13780 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
13790 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
137a0 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e  ..** The subtran
137b0 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
137c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69   automatically i
137d0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
137e0 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74  action.** commit
137f0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
13800 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20  .**.** Only one 
13810 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  subtransaction m
13820 61 79 20 62 65 20 61 63 74 69 76 65 20 61 74 20  ay be active at 
13830 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61  a time.  It is a
13840 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a  n error to try.*
13850 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  * to start a new
13860 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
13870 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72  if another subtr
13880 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
13890 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a  eady active..**.
138a0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
138b0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
138c0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
138d0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
138e0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
138f0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
13900 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
13910 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
13920 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
13930 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
13940 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
13950 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
13960 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
13970 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
13980 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
13990 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
139a0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
139b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
139c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
139d0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
139e0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
139f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13a00 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
13a10 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13a20 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13a30 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e  db;.  if( (p->in
13a40 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
13a50 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74  TE) || pBt->inSt
13a60 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  mt ){.    rc = p
13a70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
13a80 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
13a90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
13ab0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
13ac0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
13ad0 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ITE );.    rc = 
13ae0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
13af0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
13b00 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
13b10 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  n(pBt->pPager);.
13b20 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
13b30 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
13b40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13b50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13b60 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
13b70 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74  he statment subt
13b80 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
13b90 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
13ba0 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74  .  If no.** subt
13bb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
13bc0 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20  tive, this is a 
13bd0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
13be0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13bf0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
13c00 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
13c10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13c20 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
13c30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
13c40 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
13c50 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74   if( pBt->inStmt
13c60 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e   && !pBt->readOn
13c70 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ly ){.    rc = s
13c80 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
13c90 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  ommit(pBt->pPage
13ca0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
13cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13cc0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74  .  }.  pBt->inSt
13cd0 6d 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  mt = 0;.  sqlite
13ce0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13d00 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
13d10 68 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  he active statem
13d20 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
13d30 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72  on.  If no subtr
13d40 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
13d50 61 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74  active this rout
13d60 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
13d70 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  **.** All cursor
13d80 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
13d90 64 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70  dated by this op
13da0 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
13db0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20  tempt.** to use 
13dc0 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61  a cursor that wa
13dd0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
13de0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
13df0 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c  operation.** wil
13e00 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
13e10 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
13e20 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
13e30 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  kStmt(Btree *p){
13e40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13e50 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
13e60 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
13e70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13e80 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
13e90 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
13ea0 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
13eb0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
13ec0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13ed0 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c  te3PagerStmtRoll
13ee0 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
13ef0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
13f00 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
13f10 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
13f20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
13f30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
13f40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13f60 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
13f70 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
13f80 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
13f90 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
13fa0 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61  * iTable.  The a
13fb0 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20  ct of acquiring 
13fc0 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20  a cursor gets a 
13fd0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a  read lock on .**
13fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13ff0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  le..**.** If wrF
14000 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
14010 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
14020 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
14030 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
14040 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
14050 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
14060 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
14070 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
14080 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
14090 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
140a0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
140b0 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
140c0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
140d0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
140e0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
140f0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
14100 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
14110 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
14120 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
14130 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
14140 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
14150 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14160 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
14170 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
14180 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
14190 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
141a0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
141b0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
141c0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
141d0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
141e0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
141f0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
14200 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
14210 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
14220 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
14230 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
14240 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
14250 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
14260 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
14270 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14280 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
14290 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
142a0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
142b0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
142c0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
142d0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
142e0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
142f0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
14300 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
14310 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
14320 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
14330 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
14340 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
14350 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
14360 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
14370 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
14380 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
14390 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
143a0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
143b0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
143e0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
143f0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
14420 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
14430 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
14440 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14460 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
14470 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
14480 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
14490 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
144a0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
144b0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
144c0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
144d0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
14500 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
14510 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
14520 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14530 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
14540 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
14550 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
14560 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
14570 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
14580 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65  Only ){.      re
14590 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
145a0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
145b0 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
145c0 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29  ks(p, iTable, 0)
145d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
145e0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
145f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
14600 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
14610 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  ){.    rc = lock
14620 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
14630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14660 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
14670 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c  readOnly && wrFl
14680 61 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ag ){.      retu
14690 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
146a0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LY;.    }.  }.  
146b0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
146c0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
146d0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
146e0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
146f0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
14700 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ger)==0 ){.    r
14710 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  c = SQLITE_EMPTY
14720 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
14730 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
14740 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  on;.  }.  rc = g
14750 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
14760 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
14770 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c  t, &pCur->pPage,
14780 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
14790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
147a0 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
147b0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
147c0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
147d0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
147e0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
147f0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
14800 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
14810 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20  variables, link 
14820 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
14830 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
14840 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72  t and set *ppCur
14850 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75   (the.  ** outpu
14860 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
14870 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20  is function)..  
14880 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  */.  pCur->pKeyI
14890 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
148a0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
148b0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
148c0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
148d0 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a  rFlag = wrFlag;.
148e0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
148f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
14900 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
14910 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
14920 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
14930 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
14940 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
14950 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
14960 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a 20  RSOR_INVALID;.. 
14970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14980 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f  K;..create_curso
14990 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69  r_exception:.  i
149a0 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72  f( pCur ){.    r
149b0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
149c0 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 75  >pPage);.  }.  u
149d0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
149e0 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
149f0 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
14a00 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
14a10 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a40 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
14a50 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14a80 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
14a90 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
14aa0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
14ad0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
14ae0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
14af0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
14b00 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
14b10 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
14b20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
14b30 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
14b40 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
14b70 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
14b80 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
14b90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14ba0 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
14bb0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
14bc0 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
14bd0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
14be0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
14bf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14c00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14c10 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
14c20 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
14c30 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ze(){.  return s
14c40 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b  izeof(BtCursor);
14c50 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  .}..../*.** Clos
14c60 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
14c70 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
14c80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14c90 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
14ca0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
14cb0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
14cc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14cd0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
14ce0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
14cf0 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
14d00 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
14d10 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
14d20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
14d30 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
14d40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14d50 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
14d60 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74 72 65   pBt->db = pBtre
14d70 65 2d 3e 64 62 3b 0a 20 20 20 20 63 6c 65 61 72  e->db;.    clear
14d80 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
14d90 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Cur);.    if( pC
14da0 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
14db0 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
14dc0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
14dd0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
14de0 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
14df0 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
14e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14e10 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
14e20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74       pCur->pNext
14e30 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
14e40 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
14e50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
14e60 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 75  r->pPage);.    u
14e70 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
14e80 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
14e90 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
14ea0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
14eb0 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
14ec0 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
14ed0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14ee0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
14ef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
14f10 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
14f20 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20  r by filling in 
14f30 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54  the fields of pT
14f40 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74  empCur..** The t
14f50 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
14f60 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
14f70 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68  rsor list for th
14f80 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  e Btree..*/.void
14f90 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
14fa0 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
14fb0 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
14fc0 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
14fd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
14fe0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
14ff0 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65   );.  memcpy(pTe
15000 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a  mpCur, pCur, siz
15010 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70  eof(*pCur));.  p
15020 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  TempCur->pNext =
15030 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e   0;.  pTempCur->
15040 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28  pPrev = 0;.  if(
15050 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65   pTempCur->pPage
15060 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
15070 61 67 65 72 52 65 66 28 70 54 65 6d 70 43 75 72  agerRef(pTempCur
15080 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ->pPage->pDbPage
15090 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
150a0 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61  Delete a tempora
150b0 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20 61  ry cursor such a
150c0 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74 68  s was made by th
150d0 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72  e CreateTemporar
150e0 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e  yCursor().** fun
150f0 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ction above..*/.
15100 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
15110 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73  eReleaseTempCurs
15120 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
15130 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
15140 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
15150 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
15160 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20  ur->pPage ){.   
15170 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
15180 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ef(pCur->pPage->
15190 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
151a0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
151b0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
151c0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
151d0 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
151e0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
151f0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
15200 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
15210 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
15220 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
15230 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
15240 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
15250 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
15260 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
15270 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
15280 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
15290 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
152a0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
152b0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
152c0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
152d0 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
152e0 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
152f0 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
15300 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
15310 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
15320 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
15330 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
15340 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
15350 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
15360 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
15370 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
15380 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
15390 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
153a0 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
153b0 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
153c0 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
153d0 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
153e0 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
153f0 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
15400 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
15410 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
15420 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
15430 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
15440 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
15450 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
15460 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
15470 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
15480 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
15490 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
154a0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
154b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
154c0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
154d0 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
154e0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
154f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
15500 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
15510 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
15520 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  idx, &info);.   
15530 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
15540 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
15550 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
15560 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
15570 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
15580 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
15590 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
155a0 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
155b0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
155c0 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
155d0 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
155e0 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
155f0 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
15600 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
15610 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
15620 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
15630 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ze==0 ){.      s
15640 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
15650 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
15660 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
15670 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 7d  ur->info);.    }
15680 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
15690 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
156a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
156b0 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
156c0 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
156d0 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
156e0 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
156f0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
15700 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
15710 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
15720 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
15760 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
15770 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
157b0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
157c0 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
157d0 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e  ur->idx, &pCur->
157e0 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 20 5c  info);         \
157f0 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
15840 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
15850 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
15890 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
158a0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
158b0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
158c0 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
158d0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
158e0 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
158f0 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
15900 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
15910 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
15920 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
15930 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
15940 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
15950 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
15960 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
15970 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
15980 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
15990 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
159a0 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
159b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
159c0 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74   the key..*/.int
159d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
159e0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
159f0 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
15a00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
15a10 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
15a20 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
15a30 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
15a40 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
15a50 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
15a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15a70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15a80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15a90 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
15aa0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15ab0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
15ac0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
15ad0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
15ae0 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a  D ){.      *pSiz
15af0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
15b00 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  {.      getCellI
15b10 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
15b20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
15b30 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d  info.nKey;.    }
15b40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
15b60 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
15b70 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
15b80 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
15b90 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
15ba0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
15bb0 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74   to.  Always ret
15bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
15bd0 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
15be0 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74   possible.  If t
15bf0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
15c00 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
15c10 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74  inting to an ent
15c20 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61  ry (which can ha
15c30 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  ppen, for exampl
15c40 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74  e, if.** the dat
15c50 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20  abase is empty) 
15c60 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73  then *pSize is s
15c70 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20  et to 0..*/.int 
15c80 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
15c90 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
15ca0 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
15cb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
15cc0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
15cd0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
15ce0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
15cf0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
15d00 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
15d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15d20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15d30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15d40 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
15d50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15d60 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
15d70 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
15d80 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
15d90 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
15da0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
15db0 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65  valid entry - se
15dc0 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a  t *pSize to 0. *
15dd0 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  /.      *pSize =
15de0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
15df0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
15e00 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
15e10 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
15e20 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  o.nData;.    }. 
15e30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15e40 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
15e50 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15e60 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
15e70 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
15e80 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
15e90 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
15ea0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
15eb0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
15ec0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15ed0 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
15ee0 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
15ef0 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
15f00 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
15f10 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
15f20 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
15f30 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
15f40 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
15f50 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
15f60 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
15f70 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
15f80 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
15f90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
15fa0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
15fb0 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e  ** Unless pPgnoN
15fc0 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ext is NULL, the
15fd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15fe0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
15ff0 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  w .** page in th
16000 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
16010 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
16020 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
16030 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c  ovfl.** is the l
16040 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
16050 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50  linked list, *pP
16060 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
16070 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
16080 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
16090 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73  NULL, *ppPage is
160a0 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50   set to the MemP
160b0 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66  age* handle.** f
160c0 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68  or page ovfl. Th
160d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67  e underlying pag
160e0 65 72 20 70 61 67 65 20 6d 61 79 20 68 61 76 65  er page may have
160f0 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a   been requested.
16100 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f  ** with the noCo
16110 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20  ntent flag set, 
16120 73 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  so the page data
16130 20 61 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a   accessable via.
16140 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d  ** this handle m
16150 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65  ay not be truste
16160 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16170 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
16180 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
16190 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c  t, .  Pgno ovfl,
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
161c0 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  age */.  MemPage
161d0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
161e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
161f0 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  mPage handle */.
16200 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
16210 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
16220 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
16230 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
16240 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
16250 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  xt = 0;.  int rc
16260 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
16270 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16280 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
16290 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65   /* One of these
162a0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c   must not be NUL
162b0 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  L. Otherwise, wh
162c0 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  y call this func
162d0 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72  tion? */.  asser
162e0 74 28 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e  t(ppPage || pPgn
162f0 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66  oNext);..  /* If
16300 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55   pPgnoNext is NU
16310 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
16320 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
16330 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
16340 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a  .  ** a MemPage*
16350 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e   reference only.
16360 20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73   No page-data is
16370 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 69   required in thi
16380 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  s case..  */.  i
16390 66 28 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b  f( !pPgnoNext ){
163a0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
163b0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
163c0 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67  pBt, ovfl, ppPag
163d0 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  e, 1);.  }..#ifn
163e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
163f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
16400 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
16410 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
16420 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
16430 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
16440 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
16450 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
16460 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
16470 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
16480 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
16490 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
164a0 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
164b0 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
164c0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
164d0 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
164e0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
164f0 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
16500 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
16510 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
16520 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
16530 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
16540 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
16550 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
16560 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
16570 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
16580 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
16590 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
165a0 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
165b0 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
165c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
165d0 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
165e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
165f0 47 75 65 73 73 3c 3d 73 71 6c 69 74 65 33 50 61  Guess<=sqlite3Pa
16600 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16610 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
16620 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
16630 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
16640 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
16650 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16680 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
16690 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
166a0 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
166b0 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
166c0 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
166d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
166e0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
166f0 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65  ext==0 || ppPage
16700 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
16710 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  *pPage = 0;..   
16720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
16730 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
16740 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78  vfl, &pPage, nex
16750 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72  t!=0);.    asser
16760 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
16770 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20  || pPage==0);.  
16780 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26    if( next==0 &&
16790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
167a0 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
167b0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
167c0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Data);.    }..  
167d0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
167e0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
167f0 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65  pPage;.    }else
16800 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
16810 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
16820 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65  }.  }.  *pPgnoNe
16830 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65  xt = next;..  re
16840 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16850 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
16860 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
16870 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
16880 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
16890 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
168a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
168b0 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
168c0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
168d0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
168e0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
168f0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
16900 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
16910 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
16920 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
16930 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
16940 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
16950 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
16960 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
16970 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
16980 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
16990 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
169a0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
169b0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
169c0 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
169d0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
169e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
169f0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
16a00 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
16a10 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
16a20 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
16a30 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
16a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
16a50 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
16a60 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
16a70 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
16a80 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16a90 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
16aa0 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
16ab0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16ac0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
16ad0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
16b00 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
16b10 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
16b20 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
16b30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
16b40 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
16b50 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
16b60 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
16b70 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
16b80 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
16b90 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
16ba0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
16bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16bc0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
16bd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16be0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
16bf0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16c00 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
16c10 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
16c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
16c30 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
16c40 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
16c50 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
16c60 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
16c70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
16c80 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
16c90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16cb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
16cc0 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
16cd0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
16ce0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
16cf0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
16d00 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
16d10 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20  pointing to. If 
16d20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d  the eOp.** param
16d30 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20  eter is 0, this 
16d40 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
16d50 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64  ion (data copied
16d60 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20   into.** buffer 
16d70 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20  pBuf). If it is 
16d80 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74  non-zero, a writ
16d90 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66  e (data copied f
16da0 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  rom.** buffer pB
16db0 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  uf)..**.** A tot
16dc0 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
16dd0 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
16de0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
16df0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
16e00 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
16e10 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
16e20 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
16e30 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
16e40 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74   not make a dist
16e50 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20  inction between 
16e60 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a  key and data..**
16e70 20 49 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f   It just reads o
16e80 72 20 77 72 69 74 65 73 20 62 79 74 65 73 20 66  r writes bytes f
16e90 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20  rom the payload 
16ea0 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68  area.  Data migh
16eb0 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20  t .** appear on 
16ec0 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72  the main page or
16ed0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
16ee0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
16ef0 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73  erflow .** pages
16f00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
16f10 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c  tCursor.isIncrbl
16f20 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
16f30 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75   set, and the cu
16f40 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20  rrent.** cursor 
16f50 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
16f60 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
16f70 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63  pages, this func
16f80 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  tion.** allocate
16f90 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  s space for and 
16fa0 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73  lazily popluates
16fb0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
16fc0 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68  ge-list .** cach
16fd0 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
16fe0 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75  r.aOverflow). Su
16ff0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
17000 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65  se this.** cache
17010 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
17020 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
17030 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66   offset more eff
17040 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
17050 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
17060 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
17070 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
17080 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
17090 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
170a0 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
170b0 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
170c0 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
170d0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
170e0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
170f0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
17100 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
17110 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
17120 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
17130 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
17140 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
17150 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
17160 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
17170 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
17180 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
17190 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
171a0 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
171b0 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
171c0 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
171d0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
171e0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
171f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
17200 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
17210 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
17220 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
17230 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
17240 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
17250 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20   int offset,    
17260 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
17270 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
17280 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
17290 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
172a0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
172b0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
172c0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
172d0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
172e0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
172f0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
17300 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20  .  int skipKey, 
17310 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
17320 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61  t begins at data
17330 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
17340 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20   */.  int eOp   
17350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
17360 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
17370 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
17380 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
17390 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
173a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
173b0 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79  E_OK;.  u32 nKey
173c0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
173d0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
173e0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
173f0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70  ;     /* Btree p
17400 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 63  age of current c
17410 75 72 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a 20  ursor entry */. 
17420 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
17450 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
17460 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
17470 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
17480 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
17490 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
174a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
174b0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
174c0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
174d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  l );.  assert( o
174e0 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73  ffset>=0 );.  as
174f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
17500 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
17510 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
17520 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
17530 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
17540 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
17550 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79  .nHeader;.  nKey
17560 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65   = (pPage->intKe
17570 79 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e  y ? 0 : pCur->in
17580 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28  fo.nKey);..  if(
17590 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
175a0 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a  offset += nKey;.
175b0 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74    }.  if( offset
175c0 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
175d0 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a  ->info.nData ){.
175e0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
175f0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
17600 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
17610 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
17620 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
17630 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
17640 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
17650 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
17660 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
17670 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
17680 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
17690 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
176a0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
176b0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
176c0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
176d0 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
176e0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
176f0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
17700 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
17710 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
17720 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
17730 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
17740 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
17750 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
17760 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
17770 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
17780 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
17790 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
177a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
177b0 3b 0a 20 20 7d 0a 0a 20 20 70 42 74 20 3d 20 70  ;.  }..  pBt = p
177c0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  Cur->pBt;.  if( 
177d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
177e0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
177f0 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65  nst int ovflSize
17800 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
17810 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
17820 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
17830 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
17840 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
17850 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
17860 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
17870 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
17880 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  al]);..#ifndef S
17890 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
178a0 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  LOB.    /* If th
178b0 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  e isIncrblobHand
178c0 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  le flag is set a
178d0 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  nd the BtCursor.
178e0 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20  aOverflow[].    
178f0 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
17900 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
17910 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20  ate it now. The 
17920 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
17930 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74  t.    ** one ent
17940 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
17950 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
17960 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
17970 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   The.    ** page
17980 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
17990 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
179a0 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
179b0 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20  aOverflow[0],.  
179c0 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75    ** etc. A valu
179d0 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
179e0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
179f0 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
17a00 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68  nown".    ** (th
17a10 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
17a20 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
17a30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
17a40 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
17a50 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  dle && !pCur->aO
17a60 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
17a70 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
17a80 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
17a90 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
17aa0 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
17ab0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
17ac0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
17ad0 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65  = (Pgno *)sqlite
17ae0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
17af0 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b  of(Pgno)*nOvfl);
17b00 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
17b10 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
17b20 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
17b30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
17b40 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
17b50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
17b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
17b70 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
17b80 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
17b90 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
17ba0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
17bb0 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
17bc0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
17bd0 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
17be0 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
17bf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
17c00 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
17c10 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
17c20 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
17c30 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
17c40 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
17c50 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
17c60 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
17c70 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
17c80 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
17c90 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
17ca0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
17cb0 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
17cc0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
17cd0 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
17ce0 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
17cf0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
17d00 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
17d10 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
17d20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
17d30 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
17d40 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
17d50 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
17d60 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
17d70 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
17d80 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
17d90 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
17da0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
17db0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
17dc0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
17dd0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
17de0 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
17df0 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
17e00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
17e10 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
17e20 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
17e30 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
17e40 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
17e50 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
17e60 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
17e70 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
17e80 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
17e90 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
17ea0 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
17eb0 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
17ec0 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
17ed0 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
17ee0 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
17ef0 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
17f00 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
17f10 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
17f20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
17f30 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
17f40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
17f50 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
17f60 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
17f70 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
17f80 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
17f90 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
17fa0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
17fb0 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
17fc0 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
17fd0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
17fe0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
17ff0 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
18000 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
18010 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
18020 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
18030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18040 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
18050 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
18060 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
18070 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
18080 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
18090 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
180a0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
180b0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
180c0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
180d0 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67  */.        DbPag
180e0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
180f0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
18100 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18110 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
18120 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
18130 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  age, &pDbPage);.
18140 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
18150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18160 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
18170 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
18180 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
18190 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
181a0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
181b0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
181c0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
181d0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
181e0 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20              a = 
181f0 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
18200 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
18210 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
18220 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
18230 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
18240 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
18250 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
18260 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
18270 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
18280 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
18290 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74  0;.          amt
182a0 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20   -= a;.         
182b0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
182c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
182d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
182e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
182f0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
18300 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18310 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
18320 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18330 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
18340 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
18350 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
18360 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
18370 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
18380 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
18390 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
183a0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
183b0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
183c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
183d0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
183e0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
183f0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
18400 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
18410 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
18420 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
18430 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
18440 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
18450 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
18460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18470 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
18480 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
18490 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
184a0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
184b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
184c0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
184d0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
184e0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
184f0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
18500 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18520 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
18530 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18540 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18550 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
18560 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
18570 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
18580 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18590 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
185a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
185b0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
185c0 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
185d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
185e0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
185f0 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
18600 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
18610 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
18620 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
18630 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
18640 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b  ar*)pBuf, 0, 0);
18650 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
18670 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
18680 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18690 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
186a0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
186b0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
186c0 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
186d0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
186e0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
186f0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
18700 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18710 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
18720 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
18730 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
18740 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
18750 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
18760 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
18770 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
18780 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
18790 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
187a0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
187b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
187c0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
187d0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
187e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
187f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18800 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18810 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
18820 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
18830 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
18840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18850 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18860 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18870 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
18880 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18890 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
188a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
188b0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
188c0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
188d0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
188e0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
188f0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
18900 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20   pBuf, 1, 0);.  
18910 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18920 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
18930 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
18940 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
18950 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
18960 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
18970 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
18980 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
18990 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
189a0 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
189b0 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
189c0 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
189d0 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
189e0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
189f0 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
18a00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18a10 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
18a20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
18a30 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
18a40 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
18a50 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
18a60 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
18a70 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
18a80 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
18a90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18aa0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
18ab0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
18ac0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
18ad0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
18ae0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
18af0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
18b00 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
18b10 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
18b20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
18b30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
18b40 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
18b50 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
18b60 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
18b70 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
18b80 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
18b90 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
18ba0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
18bb0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
18bc0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
18bd0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
18be0 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65  sembly.** the ke
18bf0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
18c00 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
18c10 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
18c20 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
18c30 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
18c40 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
18c50 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
18c60 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
18c70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18c80 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
18c90 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
18ca0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
18cb0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
18cc0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
18cd0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
18ce0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
18cf0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
18d00 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
18d10 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
18d20 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
18d30 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
18d40 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
18d50 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
18d60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
18d70 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
18d80 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
18d90 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
18da0 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
18db0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
18dc0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
18dd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
18de0 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
18df0 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
18e00 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  Key;.  int nLoca
18e10 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
18e20 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ur!=0 && pCur->p
18e30 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
18e40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
18e50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18e60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
18e70 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
18e80 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ur) );.  pPage =
18e90 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
18ea0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
18eb0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
18ec0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
18ed0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
18ee0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
18ef0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
18f00 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
18f10 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
18f20 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
18f30 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
18f40 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
18f50 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
18f60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
18f70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70  ;.  }.  if( skip
18f80 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c  Key ){.    aPayl
18f90 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
18fa0 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
18fb0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b  info.nLocal - nK
18fc0 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
18fd0 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
18fe0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20  info.nLocal;.   
18ff0 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79   if( nLocal>nKey
19000 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c   ){.      nLocal
19010 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20   = nKey;.    }. 
19020 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f   }.  *pAmt = nLo
19030 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50  cal;.  return aP
19040 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
19050 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
19060 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
19070 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
19080 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
19090 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
190a0 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
190b0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
190c0 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
190d0 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
190e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
190f0 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
19100 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
19110 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
19120 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
19130 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
19140 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
19150 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
19160 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
19170 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
19180 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
19190 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
191a0 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
191b0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
191c0 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
191d0 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
191e0 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
191f0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
19200 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
19210 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
19220 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
19230 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
19240 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
19250 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
19260 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
19270 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
19280 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
19290 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
192a0 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
192b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
192c0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
192d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
192e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
192f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19300 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
19320 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
19330 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
19340 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
19350 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74  eturn 0;.}.const
19360 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
19370 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
19380 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
19390 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
193a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
193b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
193c0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
193d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
193e0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
193f0 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
19400 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
19410 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
19420 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
19430 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
19440 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
19450 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
19460 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
19470 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
19480 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
19490 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
194a0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
194b0 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
194c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
194d0 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
194e0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
194f0 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d  *pNewPage;.  Mem
19500 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a  Page *pOldPage;.
19510 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19520 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
19530 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19540 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
19560 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19570 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
19580 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
19590 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
195a0 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70  NewPage, pCur->p
195b0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
195c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
195d0 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65  NewPage->idxPare
195e0 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a  nt = pCur->idx;.
195f0 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75    pOldPage = pCu
19600 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64  r->pPage;.  pOld
19610 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
19620 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
19630 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70  e(pOldPage);.  p
19640 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65  Cur->pPage = pNe
19650 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69  wPage;.  pCur->i
19660 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
19670 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
19680 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
19690 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72  nCell<1 ){.    r
196a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
196b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
196c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
196d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
196e0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
196f0 61 67 65 20 69 73 20 74 68 65 20 76 69 72 74 75  age is the virtu
19700 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74  al root of its t
19710 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
19720 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
19730 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  e is the root pa
19740 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c  ge for most tabl
19750 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20  es.  But.** for 
19760 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
19770 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65   on page 1, some
19780 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f  time the real ro
19790 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d  ot page.** is em
197a0 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 20 74  pty except for t
197b0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
197c0 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73  .  In such cases
197d0 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
197e0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65  root page is the
197f0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 72   page that the r
19800 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20  ight-pointer of 
19810 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69  page.** 1 is poi
19820 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  nting to..*/.int
19830 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52   sqlite3BtreeIsR
19840 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  ootPage(MemPage 
19850 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61  *pPage){.  MemPa
19860 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20  ge *pParent;..  
19870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19880 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
19890 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
198a0 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
198b0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69  ge->pParent;.  i
198c0 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20  f( pParent==0 ) 
198d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
198e0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20  pParent->pgno>1 
198f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
19900 28 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72  ( get2byte(&pPar
19910 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
19920 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  nt->hdrOffset+3]
19930 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
19940 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
19950 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19960 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
19970 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
19980 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
19990 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
199a0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
199b0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
199c0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
199d0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
199e0 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
199f0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
19a00 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
19a10 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
19a20 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
19a30 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
19a40 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
19a50 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  l index..*/.void
19a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
19a70 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
19a80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
19a90 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20  Page *pParent;. 
19aa0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
19ab0 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74  .  int idxParent
19ac0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
19ad0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19ae0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
19af0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19b00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19b10 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
19b20 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
19b30 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
19b40 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 42 74  sert( !sqlite3Bt
19b50 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
19b60 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e  age) );.  pParen
19b70 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
19b80 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  nt;.  assert( pP
19b90 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64  arent!=0 );.  id
19ba0 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  xParent = pPage-
19bb0 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71  >idxParent;.  sq
19bc0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
19bd0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
19be0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
19bf0 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
19c00 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a  Page = pParent;.
19c10 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
19c20 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ze = 0;.  assert
19c30 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68  ( pParent->idxSh
19c40 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  ift==0 );.  pCur
19c50 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65 6e  ->idx = idxParen
19c60 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  t;.}../*.** Move
19c70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
19c80 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a  he root page.*/.
19c90 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
19ca0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
19cb0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
19cc0 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
19cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19ce0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
19cf0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
19d00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19d10 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
19d20 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19d30 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
19d40 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
19d50 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
19d60 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
19d70 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
19d80 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
19d90 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
19da0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
19db0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
19dc0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
19dd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
19de0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
19df0 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
19e00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19e10 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
19e20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
19e30 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  kip;.    }.    c
19e40 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
19e50 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  on(pCur);.  }.  
19e60 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50  pRoot = pCur->pP
19e70 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  age;.  if( pRoot
19e80 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d   && pRoot->pgno=
19e90 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
19ea0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19eb0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Root->isInit );.
19ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
19ed0 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
19ee0 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49  K!=(rc = getAndI
19ef0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
19f00 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  r->pgnoRoot, &pR
19f10 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a  oot, 0)).    ){.
19f20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
19f30 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
19f40 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
19f50 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
19f60 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
19f70 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  ->pPage);.    pC
19f80 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f  ur->pPage = pRoo
19f90 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  t;.  }.  pCur->i
19fa0 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
19fb0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
19fc0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
19fd0 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
19fe0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
19ff0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61  o subpage;.    a
1a000 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
1a010 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
1a020 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
1a030 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
1a040 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
1a050 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
1a060 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
1a070 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1a080 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
1a090 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a0a0 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
1a0b0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  );.  }.  pCur->e
1a0c0 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e  State = ((pCur->
1a0d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pPage->nCell>0)?
1a0e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
1a0f0 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
1a100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a110 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1a120 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
1a130 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
1a140 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1a150 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
1a160 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
1a170 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
1a180 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
1a190 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
1a1a0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
1a1b0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
1a1c0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
1a1d0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1a1e0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
1a1f0 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
1a200 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1a210 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1a220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1a230 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1a240 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1a250 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1a260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1a270 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a280 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
1a290 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1a2a0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
1a2b0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1a2c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a2d0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
1a2e0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
1a2f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
1a300 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
1a310 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1a320 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72  ur->idx));.    r
1a330 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1a340 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1a350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a360 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a370 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1a380 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
1a390 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1a3a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
1a3b0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1a3c0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
1a3d0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
1a3e0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
1a3f0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
1a400 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
1a410 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
1a420 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
1a430 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
1a440 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1a450 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
1a460 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
1a470 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1a480 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1a490 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1a4a0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
1a4b0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1a4c0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
1a4d0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1a4e0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
1a4f0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
1a500 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1a510 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
1a520 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
1a530 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1a540 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1a550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1a560 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1a570 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a580 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a5a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a5b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1a5c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1a5d0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1a5e0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1a5f0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
1a600 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1a610 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1a620 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1a630 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1a640 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1a650 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1a660 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1a670 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1a690 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1a6a0 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43  Cell - 1;.    pC
1a6b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1a6c0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1a6d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a6e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a6f0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
1a700 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1a710 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1a720 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1a730 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1a740 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1a750 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1a760 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1a770 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1a780 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1a790 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1a7a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
1a7b0 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
1a7c0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1a7d0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1a7e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1a7f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1a800 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a810 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1a820 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1a830 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1a840 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1a850 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1a870 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a880 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1a890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1a8a0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a8b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1a8c0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
1a8d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1a8f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1a900 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
1a910 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1a920 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1a930 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1a940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
1a960 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1a970 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1a980 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
1a990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
1a9a0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
1a9b0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
1a9c0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
1a9d0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
1a9e0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
1a9f0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
1aa00 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1aa10 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1aa20 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
1aa30 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1aa40 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1aa50 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
1aa60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1aa70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1aa80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1aa90 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1aaa0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1aab0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
1aac0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
1aad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1aae0 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
1aaf0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1ab00 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
1ab10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1ab20 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
1ab30 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1ab40 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1ab50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1ab60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ab70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
1ab80 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1ab90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1aba0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1abb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1abc0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1abd0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
1abe0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
1abf0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 70 4b 65  n entry near pKe
1ac00 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75 72  y/nKey..** Retur
1ac10 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
1ac20 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
1ac30 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20  EY tables, only 
1ac40 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74  the nKey paramet
1ac50 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  er is used.  pKe
1ac60 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
1ac70 20 20 46 6f 72 20 6f 74 68 65 72 20 74 61 62 6c    For other tabl
1ac80 65 73 2c 20 6e 4b 65 79 20 69 73 20 74 68 65 20  es, nKey is the 
1ac90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1aca0 6f 66 20 64 61 74 61 0a 2a 2a 20 69 6e 20 70 4b  of data.** in pK
1acb0 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ey..**.** If an 
1acc0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
1acd0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
1ace0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1acf0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
1ad00 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
1ad10 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
1ad20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
1ad30 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
1ad40 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
1ad50 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
1ad60 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
1ad70 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
1ad80 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
1ad90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1ada0 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74  t of comparing t
1adb0 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1adc0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1add0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20  he.** cursor is 
1ade0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73  written to *pRes
1adf0 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20   if pRes!=NULL. 
1ae00 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a   The meaning of.
1ae10 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  ** this value is
1ae20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1ae30 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
1ae40 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1ae50 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1ae60 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1ae70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ae80 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
1ae90 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20  than pKey or if 
1aea0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1aeb0 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
1aec0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
1aed0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
1aee0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
1aef0 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
1af00 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
1af10 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1af20 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1af30 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
1af60 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  s pKey..**.**   
1af70 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
1af80 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1af90 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1afa0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afc0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
1afd0 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
1afe0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1aff0 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
1b000 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  Cur,        /* T
1b010 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
1b020 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  moved */.  const
1b030 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
1b040 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e    /* The key con
1b050 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65 73  tent for indices
1b060 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20 74  .  Not used by t
1b070 61 62 6c 65 73 20 2a 2f 0a 20 20 69 36 34 20 6e  ables */.  i64 n
1b080 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1b090 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65    /* Size of pKe
1b0a0 79 2e 20 20 4f 72 20 74 68 65 20 6b 65 79 20 66  y.  Or the key f
1b0b0 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  or tables */.  i
1b0c0 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
1b0d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1b0e0 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
1b0f0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1b100 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b120 20 53 65 61 72 63 68 20 72 65 73 75 6c 74 20 66   Search result f
1b130 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lag */.){.  int 
1b140 72 63 3b 0a 20 20 56 64 62 65 50 61 72 73 65 64  rc;.  VdbeParsed
1b150 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 3b 0a 20  Record *pPKey;. 
1b160 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30   char aSpace[200
1b170 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  ];..  assert( cu
1b180 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b190 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1b1a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b1b0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1b1c0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1b1d0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1b1e0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1b1f0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1b200 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1b210 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
1b220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b230 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
1b240 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1b250 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1b260 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
1b270 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
1b280 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1b290 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1b2a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b2b0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1b2c0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
1b2d0 79 20 29 7b 0a 20 20 20 20 70 50 4b 65 79 20 3d  y ){.    pPKey =
1b2e0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1b2f0 20 70 50 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pPKey = sqlite3
1b300 56 64 62 65 52 65 63 6f 72 64 50 61 72 73 65 28  VdbeRecordParse(
1b310 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
1b320 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20  nKey, pKey,.    
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1b350 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53  Space, sizeof(aS
1b360 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20  pace));.    if( 
1b370 70 50 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  pPKey==0 ) retur
1b380 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1b390 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20    }.  for(;;){. 
1b3a0 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1b3b0 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1b3c0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1b3d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1b3e0 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1b3f0 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1b400 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1b410 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1b420 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1b430 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1b440 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1b450 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1b460 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  y && pKey==0 ){.
1b470 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b480 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b490 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1b4a0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
1b4b0 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
1b4c0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1b4d0 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20  >idx = upr;.    
1b4e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
1b4f0 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77  r->idx = (upr+lw
1b500 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
1b510 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66  if( lwr<=upr ) f
1b520 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f  or(;;){.      vo
1b530 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
1b540 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
1b550 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1b560 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1b570 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1b580 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1b590 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
1b5a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
1b5b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1b5c0 2d 3e 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  ->idx) + pPage->
1b5d0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
1b5e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1b5f0 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
1b600 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b        u32 dummy;
1b610 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1b620 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1b630 70 43 65 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a  pCell, &dummy);.
1b640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b650 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
1b660 6c 2c 20 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c  l, (u64 *)&nCell
1b670 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
1b680 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20  ( nCellKey<nKey 
1b690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1b6a0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1b6b0 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
1b6c0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nKey ){.        
1b6d0 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
1b6e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b6f0 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
1b700 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1b710 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61  .        int ava
1b720 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ilable;.        
1b730 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64  pCellKey = (void
1b740 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28   *)fetchPayload(
1b750 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65  pCur, &available
1b760 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  , 0);.        nC
1b770 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69  ellKey = pCur->i
1b780 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
1b790 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e    if( available>
1b7a0 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  =nCellKey ){.   
1b7b0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1b7c0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1b7d0 61 72 65 50 61 72 73 65 64 28 6e 43 65 6c 6c 4b  areParsed(nCellK
1b7e0 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 50  ey, pCellKey, pP
1b7f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
1b800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1b810 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
1b820 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b  3_malloc( nCellK
1b830 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
1b840 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
1b850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1b860 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1b870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1b880 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1b890 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b8a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b8b0 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75  ite3BtreeKey(pCu
1b8c0 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
1b8d0 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79  (void *)pCellKey
1b8e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
1b8f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1b900 72 64 43 6f 6d 70 61 72 65 50 61 72 73 65 64 28  rdCompareParsed(
1b910 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1b920 65 79 2c 20 70 50 4b 65 79 29 3b 0a 20 20 20 20  ey, pPKey);.    
1b930 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1b940 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
1b950 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1b960 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1b970 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
1b980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b990 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1b9a0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1b9b0 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
1b9c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
1b9d0 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64    lwr = pCur->id
1b9e0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
1b9f0 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
1ba00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ba10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ba20 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
1ba30 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1ba40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ba50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1ba60 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1ba70 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
1ba80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ba90 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
1baa0 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31  wr = pCur->idx+1
1bab0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bac0 20 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75         upr = pCu
1bad0 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20  r->idx-1;.      
1bae0 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
1baf0 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
1bb00 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1bb10 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1bb20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20  (lwr+upr)/2;.   
1bb30 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
1bb40 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20  wr==upr+1 );.   
1bb50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1bb60 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
1bb70 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
1bb80 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
1bb90 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1bba0 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
1bbb0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
1bbc0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
1bbd0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1bbe0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1bbf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bc00 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
1bc10 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1bc20 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
1bc30 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
1bc40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1bc50 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1bc60 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
1bc70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1bc80 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l );.      if( p
1bc90 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b  Res ) *pRes = c;
1bca0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1bcb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
1bcc0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1bcd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1bce0 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20  >idx = lwr;.    
1bcf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1bd00 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
1bd10 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1bd20 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
1bd30 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
1bd40 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
1bd50 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
1bd60 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1bd70 64 55 6e 70 61 72 73 65 28 70 50 4b 65 79 29 3b  dUnparse(pPKey);
1bd80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bd90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1bda0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
1bdb0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1bdc0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
1bdd0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
1bde0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
1bdf0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
1be00 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
1be10 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
1be20 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
1be30 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1be40 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
1be50 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
1be60 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
1be70 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
1be80 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
1be90 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1bea0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1beb0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
1bec0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1bed0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
1bee0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1bef0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
1bf00 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
1bf10 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
1bf20 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
1bf30 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
1bf40 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
1bf50 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
1bf60 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
1bf70 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
1bf80 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
1bf90 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
1bfa0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
1bfb0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
1bfc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1bfd0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1bfe0 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  nection handle f
1bff0 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
1c000 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
1c010 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f  BtreeCursorDb(co
1c020 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43  nst BtCursor *pC
1c030 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ur){.  assert( s
1c040 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c050 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1c060 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1c070 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74  return pCur->pBt
1c080 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree->db;.}../*.*
1c090 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
1c0a0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
1c0b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1c0c0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1c0d0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1c0e0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1c0f0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1c100 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1c110 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
1c120 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1c130 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
1c140 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1c150 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
1c160 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61   *pRes=1..*/.sta
1c170 74 69 63 20 69 6e 74 20 62 74 72 65 65 4e 65 78  tic int btreeNex
1c180 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1c190 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1c1a0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
1c1b0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1c1c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1c1d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1c1e0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1c1f0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1c200 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1c210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c220 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c230 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
1c240 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  es!=0 );.  pPage
1c250 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1c260 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1c270 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1c280 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
1c290 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1c2a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c2b0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
1c2c0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
1c2d0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
1c2e0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1c2f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c300 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
1c310 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1c320 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1c330 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c340 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
1c350 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78   );..  pCur->idx
1c360 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ++;.  pCur->info
1c370 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
1c380 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1c390 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1c3a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1c3b0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1c3c0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1c3d0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
1c3e0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1c3f0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
1c400 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1c410 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1c420 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1c430 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
1c440 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1c450 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c460 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
1c470 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1c480 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1c490 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  e) ){.        *p
1c4a0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1c4b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1c4c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1c4d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1c4e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c4f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1c500 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1c510 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1c520 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1c530 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
1c540 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1c550 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
1c560 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
1c570 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1c580 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c590 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1c5a0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1c5b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1c5c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c5d0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1c5e0 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1c5f0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1c600 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1c610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c620 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1c630 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1c640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
1c650 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1c660 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
1c670 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1c680 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1c690 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1c6a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1c6b0 72 63 20 3d 20 62 74 72 65 65 4e 65 78 74 28 70  rc = btreeNext(p
1c6c0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 72 65  Cur, pRes);.  re
1c6d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1c6e0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
1c6f0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
1c700 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
1c710 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1c720 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
1c730 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
1c740 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
1c750 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
1c760 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
1c770 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1c780 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1c790 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
1c7a0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1c7b0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
1c7c0 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74  *pRes=1..*/.stat
1c7d0 69 63 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  ic int btreePrev
1c7e0 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
1c7f0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1c800 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
1c810 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67  o pgno;.  MemPag
1c820 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1c830 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1c840 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1c850 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1c860 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1c870 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1c880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c890 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c8a0 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53 4f 52    }.  if( CURSOR
1c8b0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1c8c0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1c8d0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1c8e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c8f0 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
1c900 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  kip<0 ){.    pCu
1c910 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
1c920 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1c930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c940 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
1c950 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
1c960 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1c970 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1c980 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1c990 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1c9a0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  0 );.  if( !pPag
1c9b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
1c9c0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20  gno = get4byte( 
1c9d0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1c9e0 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20  pCur->idx) );.  
1c9f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1ca00 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1ca10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1ca20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ca30 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1ca40 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1ca50 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
1ca60 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
1ca70 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  dx==0 ){.      i
1ca80 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
1ca90 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29  sRootPage(pPage)
1caa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1cab0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1cac0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1cad0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1cae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1caf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1cb00 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1cb10 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
1cb20 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
1cb30 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1cb40 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1cb50 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72  >idx--;.    pCur
1cb60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1cb70 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1cb80 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70 50  >leafData && !pP
1cb90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1cba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1cbb0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
1cbc0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1cbd0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1cbe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1cbf0 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
1cc00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1cc10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1cc20 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
1cc30 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1cc40 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1cc50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1cc60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1cc70 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
1cc80 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
1cc90 52 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Res);.  return r
1cca0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
1ccb0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
1ccc0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1ccd0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
1cce0 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
1ccf0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
1cd00 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
1cd10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1cd20 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
1cd30 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
1cd40 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
1cd50 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
1cd60 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
1cd70 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
1cd80 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
1cd90 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
1cda0 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
1cdb0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
1cdc0 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
1cdd0 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
1cde0 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
1cdf0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1ce00 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
1ce10 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
1ce20 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1ce30 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
1ce40 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e  ppPage and *pPgn
1ce50 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  o are undefined 
1ce60 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
1ce70 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20  an error..** Do 
1ce80 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  not invoke sqlit
1ce90 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
1cea0 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20  n *ppPage if an 
1ceb0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1cec0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1ced0 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
1cee0 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
1cef0 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66  n a (feeble) eff
1cf00 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
1cf10 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
1cf20 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
1cf30 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
1cf40 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
1cf50 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
1cf60 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
1cf70 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
1cf80 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
1cf90 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1cfa0 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
1cfb0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
1cfc0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
1cfd0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
1cfe0 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61  f the "exact" pa
1cff0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1d000 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e  , and the page-n
1d010 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69  umber nearby exi
1d020 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65  sts .** anywhere
1d030 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1d040 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
1d050 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72  arenteed to be r
1d060 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
1d070 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
1d080 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1d090 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f  abases when allo
1d0a0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  cating a new tab
1d0b0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1d0c0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
1d0d0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1d0e0 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65  *pBt, .  MemPage
1d0f0 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67   **ppPage, .  Pg
1d100 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67  no *pPgno, .  Pg
1d110 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20  no nearby,.  u8 
1d120 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  exact.){.  MemPa
1d130 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
1d140 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20  t rc;.  int n;  
1d150 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d160 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1d170 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b  elist */.  int k
1d180 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1d190 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
1d1a0 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
1d1b0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
1d1c0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
1d1d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
1d1e0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61  vTrunk = 0;..  a
1d1f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d200 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d210 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
1d220 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1d230 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
1d240 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d250 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29  6]);.  if( n>0 )
1d260 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
1d270 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
1d280 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
1d290 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
1d2a0 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
1d2b0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
1d2c0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
1d2d0 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
1d2e0 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
1d2f0 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
1d300 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
1d310 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20   If the 'exact' 
1d320 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72  parameter was tr
1d330 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  ue and a query o
1d340 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
1d350 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
1d360 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
1d370 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
1d380 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
1d390 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
1d3a0 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
1d3b0 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
1d3c0 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
1d3d0 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
1d3e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d3f0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
1d400 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d  xact && nearby<=
1d410 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1d420 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1d430 72 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  r) ){.      u8 e
1d440 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
1d450 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
1d460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1d470 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
1d480 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1d490 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
1d4a0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
1d4b0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1d4c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
1d4d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d4e0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1d4f0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1d500 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1d510 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
1d520 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
1d530 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
1d540 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
1d550 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
1d560 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
1d570 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
1d580 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
1d590 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
1d5a0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
1d5b0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
1d5c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d5d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1d5e0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1d5f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1d600 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
1d610 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1d620 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
1d630 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
1d640 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
1d650 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
1d660 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
1d670 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
1d680 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
1d690 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
1d6a0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1d6b0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
1d6c0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
1d6d0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
1d6e0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
1d6f0 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
1d700 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
1d710 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
1d720 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
1d730 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1d740 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
1d750 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1d760 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
1d770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d780 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1d790 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d7a0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
1d7b0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
1d7c0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1d7d0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
1d7e0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
1d7f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d800 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1d810 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1d820 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1d830 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
1d840 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1d850 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1d860 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
1d870 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
1d880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1d890 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
1d8a0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
1d8b0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
1d8c0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
1d8d0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
1d8e0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
1d8f0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
1d900 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
1d910 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
1d920 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
1d930 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
1d940 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
1d950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d960 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1d970 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1d980 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d990 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1d9a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1d9b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d9c0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
1d9d0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
1d9e0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1d9f0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1da00 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1da10 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1da20 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
1da30 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1da40 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1da50 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
1da60 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
1da70 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
1da80 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
1da90 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61  e if( k>pBt->usa
1daa0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
1dab0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
1dac0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
1dad0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
1dae0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
1daf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1db00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1db10 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1db20 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1db30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1db40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1db50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1db60 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
1db70 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
1db80 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1db90 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
1dba0 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
1dbb0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
1dbc0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1dbd0 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
1dbe0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1dbf0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
1dc00 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1dc10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
1dc20 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
1dc30 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1dc40 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1dc50 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1dc60 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
1dc70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1dc80 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1dc90 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1dca0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1dcb0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1dcc0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1dcd0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
1dce0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1dcf0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1dd00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1dd10 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1dd20 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1dd30 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1dd40 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1dd50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1dd60 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
1dd70 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1dd80 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1dd90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1dda0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ddb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1ddc0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
1ddd0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
1dde0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
1ddf0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
1de00 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
1de10 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
1de20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
1de30 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
1de40 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
1de50 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1de60 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1de70 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1de80 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
1de90 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
1dea0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1deb0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
1dec0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1ded0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1dee0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
1def0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
1df00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1df10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1df20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1df30 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1df40 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1df50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1df60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1df70 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
1df80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1df90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dfa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1dfb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1dfc0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1dfd0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1dfe0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1dff0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e000 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1e010 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1e020 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1e030 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1e040 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e050 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1e060 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1e070 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1e080 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
1e090 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1e0a0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
1e0b0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1e0c0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1e0d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1e0e0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1e0f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1e100 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e110 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
1e120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1e130 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e140 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e150 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
1e160 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1e170 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1e180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e190 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e1a0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1e1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e1c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
1e1d0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1e1e0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1e1f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
1e210 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1e220 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1e230 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1e240 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1e250 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1e260 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
1e270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e280 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
1e290 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
1e2a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1e2b0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
1e2c0 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
1e2d0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
1e2e0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
1e2f0 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
1e300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e310 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1e320 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e330 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e340 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1e350 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1e360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e370 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
1e380 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1e390 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
1e3a0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1e3b0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1e3c0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1e3d0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
1e3e0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
1e3f0 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
1e400 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
1e410 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
1e420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1e430 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
1e440 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
1e450 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1e460 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
1e470 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
1e480 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
1e490 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1e4a0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1e4c0 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
1e4d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e4e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1e4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
1e500 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1e510 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
1e520 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
1e530 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1e540 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1e550 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
1e560 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
1e570 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
1e580 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
1e590 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71     if( *pPgno>sq
1e5a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1e5b0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1e5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e5d0 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66  /* Free page off
1e5e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1e5f0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
1e600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e610 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e630 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1e640 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
1e650 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
1e660 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
1e670 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
1e680 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
1e690 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e6a0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
1e6b0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
1e6c0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
1e6d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
1e6e0 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
1e6f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1e700 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1e710 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
1e720 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
1e730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1e740 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
1e750 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1e760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1e770 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1e780 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
1e790 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   1);.          i
1e7a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e7c0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1e7d0 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67  Rollback((*ppPag
1e7e0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
1e7f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1e800 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e810 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
1e820 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1e830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e850 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e860 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
1e870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e880 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1e890 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1e8a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e8b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1e8c0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
1e8d0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
1e8e0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
1e8f0 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
1e900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1e910 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
1e920 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1e930 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
1e940 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
1e950 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
1e960 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70  e file */.    *p
1e970 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 50 61  Pgno = sqlite3Pa
1e980 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1e990 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a  ->pPager) + 1;..
1e9a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e9b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1e9c0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1e9d0 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nc ){.      /* A
1e9e0 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68 61  n incr-vacuum ha
1e9f0 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77 69  s already run wi
1ea00 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
1ea10 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20  ction. So the.  
1ea20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20 61      ** page to a
1ea30 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20 66  llocate is not f
1ea40 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61 6c  rom the physical
1ea50 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1ea60 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  , but.      ** a
1ea70 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a  t pBt->nTrunc. .
1ea80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a        */.      *
1ea90 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72  pPgno = pBt->nTr
1eaa0 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  unc+1;.      if(
1eab0 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
1eac0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ead0 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50 67  ){.        (*pPg
1eae0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  no)++;.      }. 
1eaf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1eb00 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
1eb10 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1eb20 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
1eb30 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
1eb40 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
1eb50 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
1eb60 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
1eb70 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
1eb80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1eb90 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
1eba0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
1ebb0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
1ebc0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
1ebd0 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
1ebe0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
1ebf0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
1ec00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
1ec10 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
1ec20 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
1ec30 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
1ec40 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1ec50 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
1ec60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1ec70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1ec80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1ec90 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1eca0 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
1ecb0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
1ecc0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a  _PAGE(pBt) ){ (*
1ecd0 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20  pPgno)++; }.    
1ece0 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  }.    if( pBt->n
1ecf0 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  Trunc ){.      p
1ed00 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50  Bt->nTrunc = *pP
1ed10 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  gno;.    }.#endi
1ed20 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
1ed30 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1ed40 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1ed50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ed60 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1ed70 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1ed80 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1ed90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1eda0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1edb0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1edc0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1edd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ede0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1edf0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1ee00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
1ee10 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1ee20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1ee30 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
1ee40 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1ee50 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1ee60 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ee70 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
1ee80 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
1ee90 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
1eea0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1eeb0 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  vTrunk);.  retur
1eec0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1eed0 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65  dd a page of the
1eee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1eef0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1ef00 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  **.** sqlite3Pag
1ef10 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54  erUnref() is NOT
1ef20 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67   called for pPag
1ef30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ef40 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
1ef50 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53  e *pPage){.  BtS
1ef60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1ef70 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61  ge->pBt;.  MemPa
1ef80 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1ef90 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20  ->pPage1;.  int 
1efa0 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20  rc, n, k;..  /* 
1efb0 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65  Prepare the page
1efc0 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a   for freeing */.
1efd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1efe0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1eff0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1f000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f010 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20  ge->pgno>1 );.  
1f020 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1f030 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
1f040 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29  (pPage->pParent)
1f050 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ;.  pPage->pPare
1f060 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  nt = 0;..  /* In
1f070 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1f080 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
1f090 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
1f0a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f0b0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1f0c0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1f0d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20  eturn rc;.  n = 
1f0e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1f0f0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1f100 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1f110 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31  ->aData[36], n+1
1f120 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1f130 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
1f140 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
1f150 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1f160 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1f170 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
1f180 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79   then.  ** alway
1f190 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
1f1a0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
1f1b0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
1f1c0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
1f1d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f1e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1f1f0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1f200 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
1f210 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
1f220 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
1f230 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
1f240 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f250 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f260 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1f270 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
1f280 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
1f290 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
1f2a0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
1f2b0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1f2c0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
1f2d0 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ee..  */.  if( p
1f2e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1f2f0 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
1f300 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d  pPut(pBt, pPage-
1f310 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52  >pgno, PTRMAP_FR
1f320 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  EEPAGE, 0);.    
1f330 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f340 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
1f350 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
1f360 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1f370 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1f380 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1f390 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f3a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1f3b0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f3c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73  urn rc;.    mems
1f3d0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1f3e0 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34   0, 8);.    put4
1f3f0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1f400 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1f410 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45  pgno);.    TRACE
1f420 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
1f430 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65   first\n", pPage
1f440 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
1f450 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20  e{.    /* Other 
1f460 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61  free pages alrea
1f470 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69  dy exist.  Retri
1f480 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75  ve the first tru
1f490 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f  nk page.    ** o
1f4a0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
1f4b0 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20  nd find out how 
1f4c0 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68  many leaves it h
1f4d0 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  as. */.    MemPa
1f4e0 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20  ge *pTrunk;.    
1f4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f500 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65  eGetPage(pBt, ge
1f510 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1f520 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72  aData[32]), &pTr
1f530 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
1f540 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f550 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74  .    k = get4byt
1f560 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1f570 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e  [4]);.    if( k>
1f580 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
1f590 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
1f5a0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20  /* The trunk is 
1f5b0 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20  full.  Turn the 
1f5c0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
1f5d0 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20   into a new.    
1f5e0 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
1f5f0 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 20  with no leaves. 
1f600 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1f610 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f620 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1f630 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1f640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f650 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1f660 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e  ge->aData, pTrun
1f670 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  k->pgno);.      
1f680 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f690 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
1f6a0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1f6b0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1f6c0 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1f6d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  o);.        TRAC
1f6e0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1f6f0 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
1f700 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
1f710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f720 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70    pPage->pgno, p
1f730 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
1f740 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1f750 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20 20   if( k<0 ){.    
1f760 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1f770 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
1f780 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74  {.      /* Add t
1f790 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70  he newly freed p
1f7a0 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e  age as a leaf on
1f7b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75   the current tru
1f7c0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  nk */.      rc =
1f7d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f7e0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1f7f0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
1f800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f810 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f820 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1f830 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20  4], k+1);.      
1f840 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
1f850 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d  nk->aData[8+k*4]
1f860 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1f870 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
1f880 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
1f890 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f8a0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
1f8b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64  ->pDbPage);.#end
1f8c0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
1f8d0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1f8e0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
1f8f0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
1f900 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
1f910 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1f920 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1f930 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
1f940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f950 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
1f960 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
1f970 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f980 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
1f990 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
1f9a0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
1f9b0 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
1f9c0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
1f9d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1f9e0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
1f9f0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
1fa00 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
1fa10 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
1fa20 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67  l;.  int ovflPag
1fa30 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
1fa40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1fa50 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1fa60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
1fa70 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1fa80 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
1fa90 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
1faa0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
1fab0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1fac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
1fad0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
1fae0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
1faf0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
1fb00 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
1fb10 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1fb20 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1fb30 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61  flow]);.  ovflPa
1fb40 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
1fb50 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
1fb60 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
1fb70 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
1fb80 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
1fb90 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
1fba0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
1fbb0 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
1fbc0 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
1fbd0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
1fbe0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
1fbf0 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  l;.    if( ovflP
1fc00 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67  gno==0 || ovflPg
1fc10 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50  no>sqlite3PagerP
1fc20 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1fc30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
1fc40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1fc50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1fc60 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76  ..    rc = getOv
1fc70 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1fc80 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
1fc90 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26  , (nOvfl==0)?0:&
1fca0 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69  ovflPgno);.    i
1fcb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1fcc0 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  c;.    rc = free
1fcd0 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
1fce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1fcf0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
1fd00 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1fd10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1fd20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
1fd40 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
1fd50 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
1fd60 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
1fd70 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
1fd80 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
1fd90 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
1fda0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
1fdb0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
1fdc0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
1fdd0 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
1fde0 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
1fdf0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
1fe00 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
1fe10 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
1fe20 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1fe30 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1fe40 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
1fe50 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
1fe60 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
1fe70 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
1fe80 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
1fe90 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
1fea0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
1feb0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
1fec0 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
1fed0 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
1fee0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
1fef0 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
1ff00 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
1ff10 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
1ff20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
1ff30 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
1ff40 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
1ff50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1ff60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ff70 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1ff80 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1ff90 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
1ffa0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
1ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1ffc0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1ffd0 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
1ffe0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
1fff0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
20000 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
20010 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
20020 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
20030 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
20040 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
20050 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
20060 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
20070 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
20080 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
200b0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
200c0 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
200d0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
200e0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
200f0 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
20100 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
20110 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
20120 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
20130 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
20140 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
20150 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
20160 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
20170 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20180 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
20190 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
201a0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
201b0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
201c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
201d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
201e0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
201f0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
20200 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
20210 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
20220 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
20230 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
20240 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
20250 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
20260 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
20270 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
20280 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
20290 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
202a0 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
202b0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
202c0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
202d0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
202e0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
202f0 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
20300 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
20310 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
20320 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
20330 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
20340 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
20350 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
20360 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
20370 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44  ( info.nData==nD
20380 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a  ata+nZero );.  .
20390 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
203a0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
203b0 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
203c0 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
203d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
203e0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
203f0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
20400 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
20410 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
20420 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
20430 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
20440 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65  ;.    nSrc = nKe
20450 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
20460 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
20470 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
20480 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
20490 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
204a0 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
204b0 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
204c0 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
204d0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
204e0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
204f0 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
20500 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20 30   int isExact = 0
20510 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20520 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20530 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
20540 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
20550 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
20560 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
20570 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
20580 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
20590 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
205a0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
205b0 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
205c0 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
205d0 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
205e0 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
205f0 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
20600 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
20610 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
20620 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
20630 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a  ( pgnoOvfl>1 ){.
20640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 45            /* isE
20650 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20  xact = 1; */.   
20660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
20670 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
20680 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
20690 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
206a0 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
206b0 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a 23  vfl, isExact);.#
206c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
206d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
206e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
206f0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
20700 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
20710 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
20720 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
20730 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
20740 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
20750 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
20760 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
20770 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
20780 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
20790 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
207a0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
207b0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
207c0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
207d0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
207e0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
207f0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
20800 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
20810 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
20820 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
20830 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
20840 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
20850 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
20860 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
20870 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
20880 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
20890 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
208a0 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
208b0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
208c0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
208d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
208e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
208f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
20900 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
20910 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
20920 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
20930 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
20940 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
20950 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
20960 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
20970 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
20980 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
20990 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
209a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
209b0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
209c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
209d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
209e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
209f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20a00 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
20a10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
20a30 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
20a40 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
20a50 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
20a60 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
20a70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
20a80 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
20a90 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
20aa0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
20ab0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
20ac0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
20ad0 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
20ae0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
20af0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
20b00 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
20b10 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
20b20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
20b30 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
20b40 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ;.    if( nSrc>0
20b50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
20b60 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
20b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20b80 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
20b90 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
20ba0 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
20bb0 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
20bc0 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
20bd0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
20be0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
20bf0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
20c00 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
20c10 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
20c20 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
20c30 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
20c40 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
20c50 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
20c60 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
20c70 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
20c80 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
20c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20ca0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
20cb0 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ge the MemPage.p
20cc0 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f  Parent pointer o
20cd0 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73 65  n the page whose
20ce0 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69   number is.** gi
20cf0 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
20d00 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68  d argument so th
20d10 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  at MemPage.pPare
20d20 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  nt holds the.** 
20d30 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74  pointer in the t
20d40 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  hird argument..*
20d50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
20d60 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61 72  arentPage(BtShar
20d70 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
20d80 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  no, MemPage *pNe
20d90 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64 78  wParent, int idx
20da0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
20db0 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70  his;.  DbPage *p
20dc0 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
20dd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20de0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
20df0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20e00 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  NewParent!=0 );.
20e10 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
20e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
20e40 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
20e50 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
20e60 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
20e70 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
20e80 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
20e90 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d  {.    pThis = (M
20ea0 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
20eb0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
20ec0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
20ed0 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b  pThis->isInit ){
20ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20ef0 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  This->aData==sql
20f00 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
20f10 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  (pDbPage) );.   
20f20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50     if( pThis->pP
20f30 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e  arent!=pNewParen
20f40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
20f50 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
20f60 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
20f70 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65  ref(pThis->pPare
20f80 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
20f90 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61        pThis->pPa
20fa0 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e  rent = pNewParen
20fb0 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
20fc0 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50  e3PagerRef(pNewP
20fd0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
20fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
20ff0 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20  This->idxParent 
21000 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  = idx;.    }.   
21010 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
21020 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
21030 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21040 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21050 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
21060 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65  Vacuum ){.    re
21070 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
21080 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  Bt, pgno, PTRMAP
21090 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65  _BTREE, pNewPare
210a0 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23  nt->pgno);.  }.#
210b0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
210c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
210d0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
210e0 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
210f0 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
21100 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e  of pPage to poin
21110 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61  t back.** to pPa
21120 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ge..**.** In oth
21130 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76  er words, for ev
21140 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ery child of pPa
21150 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72  ge, invoke repar
21160 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20  entPage().** to 
21170 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 65  make sure that e
21180 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20  ach child knows 
21190 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69 74  that pPage is it
211a0 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  s parent..**.** 
211b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
211c0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79  s called after y
211d0 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20  ou memcpy() one 
211e0 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f  page into.** ano
211f0 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
21200 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c  int reparentChil
21210 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  dPages(MemPage *
21220 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
21230 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21240 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
21250 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21260 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
21270 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21280 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
21290 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
212a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74  Page->leaf ) ret
212b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
212c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
212d0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
212e0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
212f0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
21300 20 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65   i);.    rc = re
21310 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
21320 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
21330 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
21340 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21350 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
21360 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65   }.  rc = repare
21370 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
21380 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
21390 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
213a0 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20  set+8]), .      
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
213c0 61 67 65 2c 20 69 29 3b 0a 20 20 70 50 61 67 65  age, i);.  pPage
213d0 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
213e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
213f0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
21400 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
21410 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
21420 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
21430 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
21440 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
21450 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
21460 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
21470 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
21480 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
21490 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
214a0 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
214b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
214c0 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
214d0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
214e0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
214f0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
21500 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
21510 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
21520 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
21530 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
21540 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
21550 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
21560 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
21570 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21580 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
21590 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
215a0 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
215b0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
215c0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
215d0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
215e0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
215f0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
21600 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
21610 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
21620 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
21630 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
21640 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
21650 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
21660 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
21670 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
21680 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21690 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
216a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
216b0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
216c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
216d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
216e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
216f0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
21700 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70  .  ptr = &data[p
21710 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
21720 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20   + 2*idx];.  pc 
21730 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
21740 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 31 30  .  assert( pc>10
21750 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65   && pc+sz<=pPage
21760 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
21770 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65  e );.  freeSpace
21780 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
21790 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20  .  for(i=idx+1; 
217a0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
217b0 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20  i++, ptr+=2){.  
217c0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32    ptr[0] = ptr[2
217d0 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  ];.    ptr[1] = 
217e0 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50  ptr[3];.  }.  pP
217f0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
21800 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
21810 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
21820 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
21830 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
21840 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d  e += 2;.  pPage-
21850 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d  >idxShift = 1;.}
21860 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
21870 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
21880 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
21890 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
218a0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
218b0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
218c0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
218d0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
218e0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
218f0 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
21900 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
21910 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
21920 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
21930 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
21940 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
21950 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
21960 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
21970 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
21980 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
21990 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
219a0 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
219b0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
219c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
219d0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
219e0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
219f0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
21a00 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
21a10 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
21a20 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
21a30 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
21a40 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
21a50 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
21a60 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
21a70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
21a80 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
21a90 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
21aa0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
21ab0 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
21ac0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
21ad0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
21ae0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
21af0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
21b00 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
21b10 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
21b20 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
21b30 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
21b40 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
21b50 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
21b60 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
21b70 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
21b80 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
21b90 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
21ba0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
21bb0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
21bc0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
21bd0 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
21be0 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
21bf0 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
21c00 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
21c10 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
21c20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
21c30 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
21c40 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
21c50 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
21c60 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
21c70 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
21c80 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
21c90 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
21ca0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
21cb0 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b  eded */.  u8 nSk
21cc0 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ip          /* D
21cd0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  o not write the 
21ce0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
21cf0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  s of the cell */
21d00 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20  .){.  int idx;  
21d10 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
21d20 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
21d30 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
21d40 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
21d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21d60 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
21d70 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
21d80 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
21d90 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   of content for 
21da0 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61  any cell in data
21db0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  [] */.  int end;
21dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
21dd0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
21de0 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
21df0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
21e00 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
21e10 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
21e20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
21e30 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
21e40 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
21e50 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
21e60 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
21e70 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61  data[] of the pa
21e80 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
21e90 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
21ea0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
21eb0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
21ec0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
21ed0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
21ee0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
21ef0 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
21f00 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
21f10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
21f20 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
21f30 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
21f40 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
21f50 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
21f60 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
21f70 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
21f80 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  w );.  assert( s
21f90 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
21fa0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
21fb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21fc0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
21fd0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
21fe0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
21ff0 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
22000 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
22010 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
22020 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
22030 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
22040 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
22050 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
22060 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
22070 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
22080 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
22090 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66  assert( j<sizeof
220a0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
220b0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
220c0 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50  fl[0]) );.    pP
220d0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
220e0 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
220f0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
22100 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50  .idx = i;.    pP
22110 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  age->nFree = 0;.
22120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
22130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22140 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
22150 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
22160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22170 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
22180 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
22190 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
221a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
221b0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
221c0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
221d0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
221e0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
221f0 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
22200 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
22210 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
22220 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
22230 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
22240 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
22250 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
22260 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
22270 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
22280 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
22290 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
222a0 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
222b0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
222c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
222d0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
222e0 63 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67  c;.      top = g
222f0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
22300 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
22310 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
22320 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
22330 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
22340 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
22350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
22360 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
22370 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
22380 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
22390 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
223a0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
223b0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20  e->nFree -= 2;. 
223c0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
223d0 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
223e0 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
223f0 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e  p);.    for(j=en
22400 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a  d-2, ptr=&data[j
22410 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20  ]; j>ins; j-=2, 
22420 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70  ptr-=2){.      p
22430 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b  tr[0] = ptr[-2];
22440 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  .      ptr[1] = 
22450 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[-1];.    }. 
22460 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
22470 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
22480 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
22490 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
224a0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
224b0 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b  e->idxShift = 1;
224c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
224d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
224e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
224f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
22500 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
22510 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
22520 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
22530 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
22540 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
22550 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
22560 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
22570 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
22580 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
22590 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e   */.      CellIn
225a0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73  fo info;.      s
225b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
225c0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
225d0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
225e0 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
225f0 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
22600 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
22610 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
22620 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  oad );.      if(
22630 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
22640 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
22650 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
22660 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
22670 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
22680 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
22690 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
226a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
226b0 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
226c0 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  >pBt, pgnoOvfl, 
226d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
226e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
226f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
22700 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
22710 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
22720 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
22730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22740 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
22750 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
22760 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
22770 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
22780 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
22790 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
227a0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
227b0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
227c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
227d0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
227e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
227f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
22800 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
22810 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
22820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
22830 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
22840 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
22850 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
22860 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
22870 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
22880 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
22890 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
228a0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
228b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
228c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
228d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
228e0 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20  int totalSize;  
228f0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
22900 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
22910 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
22920 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22930 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
22940 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20   int cellptr;   
22950 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
22960 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
22970 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
22980 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
22990 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
229a0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
229b0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
229c0 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   Data for the pa
229d0 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
229e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
229f0 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
22a00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22a10 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
22a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f 74  >mutex) );.  tot
22a30 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f  alSize = 0;.  fo
22a40 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
22a50 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53  i++){.    totalS
22a60 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ize += aSize[i];
22a70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
22a80 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c  otalSize+2*nCell
22a90 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  <=pPage->nFree )
22aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
22ab0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
22ac0 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
22ad0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
22ae0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
22af0 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
22b00 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
22b10 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
22b20 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
22b30 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20    if( nCell ){. 
22b40 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c     cellbody = al
22b50 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
22b60 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  e, totalSize);. 
22b70 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
22b80 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ody>0 );.    ass
22b90 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
22ba0 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a  e >= 2*nCell );.
22bb0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
22bc0 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20   -= 2*nCell;.   
22bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
22be0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
22bf0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
22c00 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
22c10 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
22c20 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
22c30 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
22c40 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c  e[i]);.      cel
22c50 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20  lptr += 2;.     
22c60 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69   cellbody += aSi
22c70 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ze[i];.    }.   
22c80 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
22c90 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  y==pPage->pBt->u
22ca0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d  sableSize );.  }
22cb0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
22cc0 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nCell;.}../*.*
22cd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22ce0 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
22cf0 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
22d00 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
22d10 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
22d20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
22d30 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
22d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
22d50 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
22d60 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
22d70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
22d80 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
22d90 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
22da0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
22db0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
22dc0 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
22dd0 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
22de0 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
22df0 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
22e00 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
22e10 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
22e20 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
22e30 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
22e40 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
22e50 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
22e60 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
22e70 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
22e80 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
22e90 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
22ea0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
22eb0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
22ec0 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
22ed0 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
22ee0 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
22ef0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
22f00 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
22f10 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
22f20 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
22f30 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
22f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22f50 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
22f60 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
22f70 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
22f80 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
22f90 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
22fa0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
22fb0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
22fc0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
22fd0 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
22fe0 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
22ff0 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e  ge*, int);..#ifn
23000 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23010 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
23020 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
23030 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
23040 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
23050 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
23060 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
23070 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
23080 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
23090 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
230a0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
230b0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
230c0 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
230d0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
230e0 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
230f0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
23100 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
23110 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68  rying balance th
23120 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
23130 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
23140 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
23150 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
23160 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
23170 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
23180 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
23190 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
231a0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
231b0 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
231c0 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
231d0 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
231e0 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
231f0 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
23200 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
23210 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
23220 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
23230 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
23240 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
23250 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
23260 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
23270 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
23280 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
23290 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
232a0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
232b0 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
232c0 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
232d0 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
232e0 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
232f0 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
23300 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
23310 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
23320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23330 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
23340 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65  mPage *pPage, Me
23350 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b  mPage *pParent){
23360 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
23370 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67  Page *pNew;.  Pg
23380 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
23390 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73   *pCell;.  u16 s
233a0 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
233b0 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72  o info;.  BtShar
233c0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
233d0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
233e0 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
233f0 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
23400 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
23410 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
23420 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
23450 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
23460 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
23470 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
23480 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
23490 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
234a0 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73  er cell */..  as
234b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
234c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
234d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
234e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
234f0 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
23500 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
23510 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
23520 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
23530 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
23540 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
23550 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
23560 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
23570 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
23580 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
23590 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
235a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
235b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65  rn rc;.  }.  pCe
235c0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66  ll = pPage->aOvf
235d0 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a  l[0].pCell;.  sz
235e0 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
235f0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
23600 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65  ;.  zeroPage(pNe
23610 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  w, pPage->aData[
23620 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50  0]);.  assembleP
23630 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
23640 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20  ell, &szCell);. 
23650 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
23660 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  w = 0;..  /* Set
23670 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
23680 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
23690 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65  ed page to pPare
236a0 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70  nt. */.  pNew->p
236b0 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
236c0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
236d0 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
236e0 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  Page);..  /* pPa
236f0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
23700 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
23710 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
23720 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20  ge this.  ** so 
23730 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63  that the right-c
23740 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20  hild is the new 
23750 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  page allocated a
23760 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50  bove and.  ** pP
23770 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
23780 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
23790 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
237a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
237b0 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
237c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
237d0 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73  e->nCell-1);.  s
237e0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
237f0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
23800 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
23810 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
23820 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43  pParent, parentC
23830 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
23840 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72  y, 0, 0, 0, &par
23850 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  entSize);.  if( 
23860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23870 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23880 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61    }.  assert( pa
23890 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20  rentSize<64 );. 
238a0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
238b0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
238c0 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  Idx, parentCell,
238d0 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20   parentSize, 0, 
238e0 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
238f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
23900 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
23910 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
23920 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
23930 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
23940 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75  age->pgno);.  pu
23950 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
23960 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
23970 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
23980 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66  noNew);..#ifndef
23990 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
239a0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
239b0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
239c0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
239d0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
239e0 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74  ter map.  ** wit
239f0 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
23a00 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
23a10 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
23a20 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20   the .  ** cell 
23a30 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
23a40 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
23a50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
23a60 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
23a70 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
23a80 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
23a90 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
23aa0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
23ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
23ad0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
23ae0 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pNew, 0);.    }.
23af0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
23b10 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
23b20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
23b30 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  c;.    }.  }.#en
23b40 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  dif..  /* Releas
23b50 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
23b60 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  to the new page 
23b70 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20  and balance the 
23b80 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a  parent page,.  *
23b90 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64 69  * in case the di
23ba0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72  vider cell inser
23bb0 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f  ted caused it to
23bc0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
23bd0 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
23be0 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65  Page(pNew);.  re
23bf0 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61  turn balance(pPa
23c00 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64  rent, 0);.}.#end
23c10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
23c20 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
23c30 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
23c40 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
23c50 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
23c60 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
23c70 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
23c80 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
23c90 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
23ca0 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
23cb0 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
23cc0 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
23cd0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
23ce0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
23cf0 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
23d00 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
23d10 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
23d20 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
23d30 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
23d40 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
23d50 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
23d60 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
23d70 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
23d80 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
23d90 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
23da0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
23db0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
23dc0 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
23dd0 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
23de0 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
23df0 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
23e00 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
23e10 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
23e20 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
23e30 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
23e40 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
23e50 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
23e60 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
23e70 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
23e80 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
23e90 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
23ea0 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
23eb0 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
23ec0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
23ed0 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
23ee0 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
23ef0 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
23f00 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
23f10 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
23f20 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
23f30 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
23f40 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
23f50 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
23f60 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
23f70 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
23f80 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
23f90 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
23fa0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
23fb0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
23fc0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
23fd0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
23fe0 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
23ff0 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
24000 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
24010 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
24020 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
24030 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
24040 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
24050 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
24060 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
24070 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
24080 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
24090 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
240a0 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
240b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
240c0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
240d0 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
240e0 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
240f0 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
24100 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
24110 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
24120 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
24130 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
24140 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
24150 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
24160 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
24170 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
24180 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
24190 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
241a0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
241b0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
241c0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
241d0 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
241e0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
241f0 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
24200 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
24210 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
24220 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
24230 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
24240 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
24250 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
24260 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
24270 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
24280 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53  f pPage */.  BtS
24290 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
242a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
242b0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
242c0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
242d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
242e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
242f0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
24300 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
24310 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
24320 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
24330 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
24340 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
24350 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
24380 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
24390 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20  /.  int nNew;   
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
243c0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
243d0 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
24400 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
24410 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
24440 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24460 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
24470 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
24480 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
24490 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
244a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
244b0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
244c0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
244d0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
244e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
244f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
24500 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
24510 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
24520 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
24530 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
24540 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
24550 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
24560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24570 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
24580 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
24590 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
245a0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
245b0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
245c0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
245d0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
245e0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
245f0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
24600 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
24610 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
24620 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
24630 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
24640 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
24650 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
24660 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
24670 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d  /.  int iSpace =
24680 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24690 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
246a0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b   byte of aSpace[
246b0 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
246c0 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
246d0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
246e0 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
246f0 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
24700 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  noOld[NB];      
24710 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
24720 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
24730 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  age in apOld[] *
24740 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
24750 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
24760 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
24770 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
24780 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
24790 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
247a0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
247b0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
247c0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
247d0 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  cing */.  Pgno p
247e0 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  gnoNew[NB+2];   
247f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
24800 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
24810 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20  page in apNew[] 
24820 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
24830 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
24840 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
24850 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
24860 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
24870 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
24880 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
24890 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
248a0 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
248b0 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
248c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
248d0 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
248e0 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
248f0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
24900 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24920 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
24930 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
24940 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
24950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
24960 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
24970 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
24980 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79  ] */.  u8 *aCopy
24990 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
249a0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
249b0 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
249c0 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
249d0 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20  8 *aSpace;      
249e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
249f0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70  pace to hold cop
24a00 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
24a10 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66  cells */.#ifndef
24a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
24a30 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46  OVACUUM.  u8 *aF
24a40 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
24a50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24a60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
24a70 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
24a80 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20   );..  /* .  ** 
24a90 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20  Find the parent 
24aa0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
24ab0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
24ac0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
24ad0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
24ae0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
24af0 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65  DbPage) || pPage
24b00 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
24b10 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
24b20 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20  >pBt;.  pParent 
24b30 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
24b40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
24b50 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ent );.  if( SQL
24b60 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
24b70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24b80 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
24b90 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
24ba0 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45   rc;.  }.  TRACE
24bb0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
24bc0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
24bd0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
24be0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
24bf0 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
24c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
24c10 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
24c20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
24c30 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
24c40 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
24c50 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
24c60 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
24c70 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
24c80 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
24c90 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
24ca0 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
24cb0 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
24cc0 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
24cd0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
24ce0 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
24cf0 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
24d00 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
24d10 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
24d20 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
24d30 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
24d40 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
24d50 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
24d60 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
24d70 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
24d80 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
24d90 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
24da0 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
24db0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
24dc0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
24dd0 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
24de0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
24df0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
24e00 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a  nOverflow==1 &&.
24e10 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76        pPage->aOv
24e20 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
24e30 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20  ->nCell &&.     
24e40 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
24e50 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
24e60 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
24e70 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
24e80 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
24e90 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
24ea0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
24eb0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
24ec0 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
24ed0 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
24ee0 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
24ef0 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
24f00 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
24f10 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
24f20 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
24f30 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
24f40 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61  quick(pPage, pPa
24f50 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rent);.  }.#endi
24f60 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  f..  if( SQLITE_
24f70 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
24f80 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
24f90 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  e->pDbPage)) ){.
24fa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24fb0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
24fc0 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  nd the cell in t
24fd0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
24fe0 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20  hose left child 
24ff0 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a  points back.  **
25000 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20   to pPage.  The 
25010 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69  "idx" variable i
25020 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
25030 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50  hat cell.  If pP
25040 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  age.  ** is the 
25050 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20  rightmost child 
25060 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20  of pParent then 
25070 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65  set idx to pPare
25080 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a  nt->nCell .  */.
25090 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69    if( pParent->i
250a0 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50  dxShift ){.    P
250b0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67  gno pgno;.    pg
250c0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
250d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
250e0 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
250f0 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
25100 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
25110 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78    for(idx=0; idx
25120 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b  <pParent->nCell;
25130 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69   idx++){.      i
25140 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  f( get4byte(find
25150 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64  Cell(pParent, id
25160 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  x))==pgno ){.   
25170 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25180 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
25190 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e  sert( idx<pParen
251a0 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  t->nCell.       
251b0 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74        || get4byt
251c0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
251d0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
251e0 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29  fset+8])==pgno )
251f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
25200 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  dx = pPage->idxP
25210 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arent;.  }..  /*
25220 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  ** Initialize
25230 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68   variables so th
25240 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61  at it will be sa
25250 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20  fe to jump.  ** 
25260 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61  directly to bala
25270 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61  nce_cleanup at a
25280 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  ny moment..  */.
25290 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20    nOld = nNew = 
252a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  0;.  sqlite3Page
252b0 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
252c0 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20  bPage);..  /*.  
252d0 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20  ** Find sibling 
252e0 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61  pages to pPage a
252f0 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  nd the cells in 
25300 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76  pParent that div
25310 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62  ide.  ** the sib
25320 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d  lings.  An attem
25330 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
25340 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
25350 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69  n either.  ** si
25360 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f  de of pPage.  Mo
25370 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
25380 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
25390 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66  ide, however, if
253a0 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72  .  ** pPage ther
253b0 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
253c0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
253d0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
253e0 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
253f0 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
25400 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
25410 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
25420 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
25430 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d  ..  */.  nxDiv =
25440 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28   idx - NN;.  if(
25450 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50   nxDiv + NB > pP
25460 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
25470 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72      nxDiv = pPar
25480 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20  ent->nCell - NB 
25490 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  + 1;.  }.  if( n
254a0 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78  xDiv<0 ){.    nx
254b0 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  Div = 0;.  }.  n
254c0 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Div = 0;.  for(i
254d0 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
254e0 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
254f0 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
25500 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
25510 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
25520 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
25530 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20  .      nDiv++;. 
25540 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
25550 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  arent->leaf );. 
25560 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
25570 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
25580 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
25590 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e  if( k==pParent->
255a0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  nCell ){.      p
255b0 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
255c0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
255d0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
255e0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
255f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
25600 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
25610 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
25620 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b  ge(pBt, pgnoOld[
25630 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70  i], &apOld[i], p
25640 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
25650 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
25660 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
25670 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72  apOld[i]->idxPar
25680 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43  ent = k;.    apC
25690 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  opy[i] = 0;.    
256a0 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20  assert( i==nOld 
256b0 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20  );.    nOld++;. 
256c0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
256d0 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
256e0 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
256f0 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rflow;.  }..  /*
25700 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
25710 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
25720 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
25730 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
25740 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
25750 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
25760 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
25770 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
25780 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
25790 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
257a0 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20    */.  apCell = 
257b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
257c0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
257d0 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
25800 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
25810 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
25840 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28  .     + (ROUND8(
25850 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
25860 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a  +pBt->pageSize)*
25870 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a  NB  /* aCopy */.
25880 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
25890 53 69 7a 65 2a 35 20 20 20 20 20 20 20 20 20 20  Size*5          
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258b0 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a     /* aSpace */.
258c0 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41       + (ISAUTOVA
258d0 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73  CUUM ? nMaxCells
258e0 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20 20   : 0)           
258f0 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20     /* aFrom */. 
25900 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
25910 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
25920 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25930 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
25940 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
25950 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
25960 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
25970 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75  .  aCopy[0] = (u
25980 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
25990 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
259a0 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75   ((aCopy[0] - (u
259b0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
259c0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
259d0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
259e0 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
259f0 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
25a00 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
25a10 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
25a20 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
25a30 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
25a40 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
25a50 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70  opy[i] - (u8*)ap
25a60 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
25a70 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
25a80 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
25a90 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20  .  }.  aSpace = 
25aa0 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74  &aCopy[NB-1][pBt
25ab0 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
25ac0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
25ad0 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ))];.  assert( (
25ae0 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61  (aSpace - (u8*)a
25af0 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
25b00 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
25b10 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
25b20 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
25b30 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25b40 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
25b50 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46  Vacuum ){.    aF
25b60 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a  rom = &aSpace[5*
25b70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
25b80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
25b90 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70  /*.  ** Make cop
25ba0 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ies of the conte
25bb0 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20  nt of pPage and 
25bc0 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74  its siblings int
25bd0 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54  o aOld[]..  ** T
25be0 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
25bf0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  function will us
25c00 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
25c10 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20  copies rather.  
25c20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
25c30 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
25c40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
25c50 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
25c60 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  he.  ** process 
25c70 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
25c80 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tten..  */.  for
25c90 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
25ca0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
25cb0 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  *p = apCopy[i] =
25cc0 20 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79   (MemPage*)aCopy
25cd0 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [i];.    memcpy(
25ce0 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  p, apOld[i], siz
25cf0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
25d00 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76     p->aData = (v
25d10 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  oid*)&p[1];.    
25d20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c  memcpy(p->aData,
25d30 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61   apOld[i]->aData
25d40 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
25d50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
25d60 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74   Load pointers t
25d70 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73  o all cells on s
25d80 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64  ibling pages and
25d90 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
25da0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  ls.  ** into the
25db0 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20   local apCell[] 
25dc0 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70  array.  Make cop
25dd0 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  ies of the divid
25de0 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
25df0 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
25e00 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20  d form aSpace[] 
25e10 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
25e20 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
25e30 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
25e40 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
25e50 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
25e60 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
25e70 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
25e80 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
25e90 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
25ea0 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
25eb0 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
25ec0 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
25ed0 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
25ee0 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68  aSpace[].  In th
25ef0 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
25f00 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
25f10 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
25f20 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
25f30 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
25f40 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
25f50 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
25f60 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
25f70 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
25f80 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
25f90 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
25fa0 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
25fb0 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
25fc0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
25fd0 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
25fe0 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
25ff0 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
26000 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
26010 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
26020 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
26030 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
26040 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
26050 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b   */.  nCell = 0;
26060 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
26070 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a  n = pPage->leaf*
26080 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
26090 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
260a0 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  && pPage->leaf;.
260b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
260c0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
260d0 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
260e0 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[i];.    int 
260f0 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
26100 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
26110 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
26120 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
26130 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
26140 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
26150 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
26160 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
26170 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
26180 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
26190 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
261a0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
261b0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64  l[nCell]);.#ifnd
261c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
261d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
261e0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
261f0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  uum ){.        i
26200 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46  nt a;.        aF
26210 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a  rom[nCell] = i;.
26220 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b          for(a=0;
26230 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   a<pOld->nOverfl
26240 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; a++){.      
26250 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f      if( pOld->aO
26260 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70  vfl[a].pCell==ap
26270 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20  Cell[nCell] ){. 
26280 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d             aFrom
26290 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
262a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
262b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
262c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
262d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 43  .#endif.      nC
262e0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
262f0 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b   if( i<nOld-1 ){
26300 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
26310 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
26320 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
26330 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
26340 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
26350 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41   With the LEAFDA
26360 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74  TA flag, pParent
26370 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79   cells hold only
26380 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20   INTKEYs that.  
26390 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70        ** are dup
263a0 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20  licates of keys 
263b0 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  on the child pag
263c0 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  es.  We need to 
263d0 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  remove.        *
263e0 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  * the divider ce
263f0 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74  lls from pParent
26400 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65  , but the divide
26410 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74  rs cells are not
26420 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
26430 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65  d to apCell[] be
26440 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64  cause they are d
26450 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69  uplicates of chi
26460 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20  ld cells..      
26470 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f    */.        dro
26480 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
26490 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
264a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
264b0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
264c0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
264d0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
264e0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
264f0 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
26500 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
26510 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  e[iSpace];.     
26520 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b     iSpace += sz;
26530 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26540 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61   iSpace<=pBt->pa
26550 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20  geSize*5 );.    
26560 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
26570 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
26580 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
26590 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c  nCell] = pTemp+l
265a0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23  eafCorrection;.#
265b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
265c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
265d0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
265e0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
265f0 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
26600 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
26610 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
26620 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
26630 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
26640 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
26650 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66  l[nCell] -= leaf
26660 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
26670 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
26680 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e  byte(pTemp)==pgn
26690 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20  oOld[i] );.     
266a0 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
266b0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
266c0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
266d0 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
266e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
266f0 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
26700 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
26710 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
26720 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eft.          **
26730 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
26740 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
26750 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
26760 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
26770 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c  &pOld->aData[pOl
26780 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  d->hdrOffset+8],
26790 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
267a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
267b0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
267c0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
267d0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
267e0 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
267f0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
26800 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
26810 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
26820 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
26830 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
26840 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
26850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26860 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
26870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26880 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
26890 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
268a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
268b0 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
268c0 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
268d0 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
268e0 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
268f0 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
26900 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
26910 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
26920 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
26930 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
26940 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
26950 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
26960 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
26970 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
26980 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
26990 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
269a0 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
269b0 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
269c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
269d0 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
269e0 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
269f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
26a00 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
26a10 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
26a20 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
26a30 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
26a40 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
26a50 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
26a60 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
26a70 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
26a80 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
26a90 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
26aa0 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
26ab0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
26ac0 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
26ad0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
26ae0 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
26af0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
26b00 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
26b10 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
26b20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
26b30 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
26b40 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
26b50 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
26b60 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
26b70 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
26b80 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
26b90 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
26ba0 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
26bb0 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
26bc0 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
26bd0 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
26be0 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
26bf0 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
26c00 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
26c10 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
26c20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
26c30 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
26c40 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
26c50 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
26c60 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
26c70 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
26c80 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
26c90 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
26ca0 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
26cb0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
26cc0 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
26cd0 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
26ce0 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
26cf0 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
26d00 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
26d10 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
26d20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
26d30 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
26d40 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
26d50 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
26d60 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
26d70 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
26d80 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
26d90 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
26da0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
26db0 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
26dc0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
26dd0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
26de0 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
26df0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
26e00 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
26e10 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
26e20 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
26e30 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
26e40 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
26e50 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
26e60 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
26e70 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
26e80 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
26e90 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
26ea0 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
26eb0 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
26ec0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
26ed0 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
26ee0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
26ef0 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
26f00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
26f10 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
26f20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
26f30 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
26f40 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
26f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26f60 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
26f70 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
26f80 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
26f90 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
26fa0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
26fb0 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
26fc0 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
26fd0 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
26fe0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
26ff0 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
27000 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
27010 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
27020 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
27030 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
27040 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
27050 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
27060 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
27070 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
27080 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
27090 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
270a0 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
270b0 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
270c0 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
270d0 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
270e0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
270f0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
27100 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
27110 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
27120 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
27130 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
27140 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
27150 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
27160 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
27170 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
27180 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20  ])>0) or we are 
27190 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  the.  ** a virtu
271a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
271b0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
271c0 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
271d0 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
271e0 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
271f0 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
27200 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
27210 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
27220 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
27230 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
27240 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
27250 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
27260 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
27270 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
27280 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
27290 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
272a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
272b0 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
272c0 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50    pageFlags = pP
272d0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  age->aData[0];. 
272e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
272f0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
27300 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
27310 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
27320 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
27330 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
27340 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
27350 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20  gnoOld[i];.     
27360 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
27370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27380 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
27390 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
273a0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
273b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
273c0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
273d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
273e0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
273f0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
27400 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
27410 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
27420 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31  [i], pgnoNew[i-1
27430 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
27440 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
27450 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27460 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
27470 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
27480 0a 20 20 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50  .    }.    zeroP
27490 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
274a0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
274b0 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
274c0 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
274d0 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
274e0 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
274f0 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
27500 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
27510 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
27520 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
27530 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
27540 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
27550 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
27560 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
27570 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
27580 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
27590 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
275a0 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
275b0 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
275c0 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
275d0 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
275e0 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
275f0 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
27600 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
27610 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
27620 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
27630 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
27640 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
27650 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
27660 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
27670 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
27680 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
27690 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
276a0 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
276b0 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
276c0 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
276d0 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
276e0 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
276f0 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
27700 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
27710 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
27720 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
27730 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
27740 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
27750 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
27760 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
27770 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
27780 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
27790 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
277a0 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
277b0 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
277c0 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
277d0 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
277e0 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
277f0 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
27800 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75  f( pgnoNew[j]<(u
27810 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
27820 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
27830 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
27840 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20   pgnoNew[j];.   
27850 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
27860 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
27870 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
27880 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
27890 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69     t = pgnoNew[i
278a0 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  ];.      pT = ap
278b0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  New[i];.      pg
278c0 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e  noNew[i] = pgnoN
278d0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
278e0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
278f0 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67  [minI];.      pg
27900 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b  noNew[minI] = t;
27910 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
27920 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
27930 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   }.  TRACE(("BAL
27940 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
27950 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29   %d  new: %d(%d)
27960 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
27970 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
27980 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c  .    pgnoOld[0],
27990 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
279a0 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a  pgnoOld[1] : 0,.
279b0 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67      nOld>=3 ? pg
279c0 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20  noOld[2] : 0,.  
279d0 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a    pgnoNew[0], sz
279e0 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
279f0 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d  >=2 ? pgnoNew[1]
27a00 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
27a10 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
27a20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f    nNew>=3 ? pgno
27a30 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[2] : 0, nNew
27a40 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
27a50 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
27a60 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30  ? pgnoNew[3] : 0
27a70 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
27a80 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
27a90 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=5 ? pgnoNew[
27aa0 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  4] : 0, nNew>=5 
27ab0 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
27ac0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
27ad0 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
27ae0 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
27af0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
27b00 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
27b10 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
27b20 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
27b30 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
27b40 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
27b50 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
27b60 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
27b70 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
27b80 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
27b90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
27ba0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
27bb0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
27bc0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
27bd0 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d  rt( pNew->pgno==
27be0 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20  pgnoNew[i] );.  
27bf0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
27c00 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
27c10 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
27c20 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
27c30 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
27c40 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
27c50 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
27c60 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
27c70 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
27c80 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ==0 );..#ifndef 
27c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27ca0 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66  VACUUM.    /* If
27cb0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
27cc0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
27cd0 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
27ce0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
27cf0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  .    ** that poi
27d00 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e  nt to the siblin
27d10 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61  gs that were rea
27d20 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63  rranged. These c
27d30 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20  an be: left.    
27d40 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63  ** children of c
27d50 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d  ells, the right-
27d60 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67  child of the pag
27d70 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e, or overflow p
27d80 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ages.    ** poin
27d90 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e  ted to by cells.
27da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27db0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
27dc0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a  ){.      for(k=j
27dd0 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b  ; k<cntNew[i]; k
27de0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
27df0 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73  ert( k<nMaxCells
27e00 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
27e10 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c  aFrom[k]==0xFF |
27e20 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b  | apCopy[aFrom[k
27e30 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ]]->pgno!=pNew->
27e40 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
27e50 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
27e60 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b  Ovfl(pNew, k-j);
27e70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
27e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27e90 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
27ea0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
27eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27ed0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
27ee0 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
27ef0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
27f00 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
27f10 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
27f20 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
27f30 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
27f40 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
27f50 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
27f60 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
27f70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
27f80 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65  <nNew-1 && j<nCe
27f90 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
27fa0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
27fb0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
27fc0 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
27fd0 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
27fe0 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
27ff0 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
28000 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
28010 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
28020 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  on;.      if( !p
28030 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  New->leaf ){.   
28040 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
28050 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65  w->aData[8], pCe
28060 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ll, 4);.        
28070 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
28080 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
28090 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
280a0 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
280b0 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
280c0 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
280d0 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
280e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
280f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
28100 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
28110 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
28120 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
28130 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
28140 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
28150 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
28160 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
28170 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
28180 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
28190 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
281a0 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
281b0 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
281c0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
281d0 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71   j--;.        sq
281e0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
281f0 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
28200 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
28210 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
28220 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
28230 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43  .        fillInC
28240 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65  ell(pParent, pCe
28250 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
28260 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  , 0, 0, 0, &sz);
28270 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
28280 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
28290 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
282a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
282b0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
282c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
282d0 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
282e0 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54  -= 4;.        pT
282f0 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53  emp = &aSpace[iS
28300 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  pace];.        i
28310 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
28320 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
28330 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
28340 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
28350 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
28360 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
28370 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
28380 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
28390 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
283a0 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
283b0 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
283c0 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
283d0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
283e0 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
283f0 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
28400 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
28410 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
28420 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42  ** (see sqlite3B
28430 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
28440 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
28450 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
28460 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
28470 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
28480 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
28490 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
284a0 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
284b0 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
284c0 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
284d0 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
284e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
284f0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
28500 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
28510 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
28520 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
28530 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
28540 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
28550 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
28560 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
28570 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
28580 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
28590 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
285a0 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
285b0 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
285c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
285d0 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
285e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
285f0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
28600 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
28610 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
28620 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
28630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28640 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
28650 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
28660 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
28670 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20   pTemp, 4);.    
28680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28690 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
286a0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
286b0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
286c0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
286d0 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77  ent,nxDiv), pNew
286e0 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
286f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
28700 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
28710 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
28720 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
28730 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
28740 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
28750 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
28760 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
28770 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
28780 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
28790 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
287a0 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
287b0 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
287c0 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
287d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
287e0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
287f0 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61  uum && !leafData
28800 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28810 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
28820 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
28830 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28850 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
28860 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
28870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
28880 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b  endif.      j++;
28890 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
288a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
288b0 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
288c0 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
288d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
288e0 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
288f0 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
28900 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  EAF)==0 ){.    m
28910 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
28920 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
28930 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
28940 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
28950 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d   }.  if( nxDiv==
28960 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
28970 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
28980 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
28990 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
289a0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
289b0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
289c0 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
289d0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
289e0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
289f0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
28a00 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
28a10 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
28a20 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
28a30 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
28a40 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
28a50 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
28a60 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
28a70 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
28a80 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
28a90 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
28aa0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
28ab0 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
28ac0 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
28ad0 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65    /*.  ** Repare
28ae0 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61  nt children of a
28af0 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  ll cells..  */. 
28b00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
28b10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
28b20 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
28b30 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ges(apNew[i]);. 
28b40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28b50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
28b60 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
28b70 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
28b80 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
28b90 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
28ba0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
28bb0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
28bc0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
28bd0 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
28be0 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
28bf0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
28c00 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
28c10 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
28c20 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
28c30 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
28c40 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
28c50 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
28c60 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
28c70 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
28c80 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
28c90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28ca0 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
28cb0 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
28cc0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a  pParent, 0);.  .
28cd0 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
28ce0 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
28cf0 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
28d00 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
28d10 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29  te3_free(apCell)
28d20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
28d30 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
28d40 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
28d50 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
28d60 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
28d70 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
28d80 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
28d90 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
28da0 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43  pParent);.  TRAC
28db0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
28dc0 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
28dd0 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
28de0 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
28df0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
28e00 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
28e10 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ll));.  return r
28e20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
28e30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
28e40 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
28e50 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
28e60 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
28e70 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
28e80 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
28e90 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
28ea0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
28eb0 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
28ec0 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
28ed0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
28ee0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d  ce_shallower(Mem
28ef0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
28f00 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70  The only child p
28f30 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  age of pPage */.
28f40 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
28f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28f60 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
28f70 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e  r pChild */.  in
28f80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
28f90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
28fa0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
28fb0 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
28fc0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54    /* The main BT
28ff0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
29000 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72  .  int mxCellPer
29010 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
29020 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
29030 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70  r of cells per p
29040 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
29050 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
29060 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
29070 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
29080 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
29090 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20    u16 *szCell;  
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
290b0 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
290c0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
290d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
290e0 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
290f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
29100 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
29110 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29120 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
29130 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
29140 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
29150 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  .  mxCellPerPage
29160 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b   = MX_CELL(pBt);
29170 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
29180 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43 65  te3_malloc( mxCe
29190 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f  llPerPage*(sizeo
291a0 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31  f(u8*)+sizeof(u1
291b0 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43  6)) );.  if( apC
291c0 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
291d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
291e0 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
291f0 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72  apCell[mxCellPer
29200 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Page];.  if( pPa
29210 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
29220 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  /* The table is 
29230 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
29240 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22   */.    TRACE(("
29250 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74  BALANCE: empty t
29260 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  able %d\n", pPag
29270 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
29280 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
29290 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
292a0 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
292b0 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
292c0 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  he.    ** inform
292d0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20  ation from that 
292e0 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74  one child into t
292f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20  he root page if 
29300 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
29310 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
29320 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
29330 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
29340 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
29350 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
29360 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61  is page 1, it ha
29370 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61  s less space ava
29380 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20  ilable than.    
29390 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75  ** its child (du
293a0 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74  e to the 100 byt
293b0 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63  e header that oc
293c0 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69  curs at the begi
293d0 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
293e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65  the database fle
293f0 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  ), so it might n
29400 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f  ot be able to ho
29410 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20  ld all of the . 
29420 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
29430 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  n currently cont
29440 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69  ained in the chi
29450 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ld.  If this is 
29460 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65  the .    ** case
29470 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
29480 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
29490 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
294a0 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  ty except.    **
294b0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
294c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
294d0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63  ild page.  The c
294e0 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65  hild page become
294f0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72  s.    ** the vir
29500 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
29510 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   tree..    */.  
29520 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
29530 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
29540 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
29550 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
29560 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
29570 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
29580 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c  ( pgnoChild<=sql
29590 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
295a0 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  nt(pPage->pBt->p
295b0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63  Pager) );.    rc
295c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
295d0 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42  etPage(pPage->pB
295e0 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70  t, pgnoChild, &p
295f0 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69  Child, 0);.    i
29600 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
29610 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
29620 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
29630 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
29640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
29650 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69  reeInitPage(pChi
29660 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20  ld, pPage);.    
29670 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29680 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
29690 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
296a0 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
296b0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
296c0 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
296d0 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
296e0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
296f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
29700 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
29710 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
29720 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
29730 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
29740 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
29750 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
29760 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
29770 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
29780 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
29790 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
297a0 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
297b0 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
297c0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
297d0 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
297e0 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
297f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
29800 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
29810 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
29820 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
29830 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
29840 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
29850 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
29860 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
29870 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
29880 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
29890 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
298a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
298b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65   .            ge
298c0 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e  t4byte(&pChild->
298d0 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64  aData[pChild->hd
298e0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
298f0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
29900 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
29910 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
29920 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
29930 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
29940 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
29950 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29960 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
29970 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
29980 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
29990 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
299a0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
299b0 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
299c0 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
299d0 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
299e0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
299f0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
29a00 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
29a10 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
29a20 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
29a30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29a40 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
29a50 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
29a60 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
29a70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
29a80 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
29a90 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  it = 0;.      pP
29aa0 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
29ab0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
29ac0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
29ad0 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
29ae0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
29af0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
29b00 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
29b10 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
29b20 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
29b30 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
29b40 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
29b50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
29b60 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
29b70 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
29b80 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
29b90 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65  ChildPages(pPage
29ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29bb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
29bc0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
29bd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
29be0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
29bf0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
29c00 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
29c10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
29c20 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
29c30 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  { .        rc = 
29c40 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
29c50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  age, i);.       
29c60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29c70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29c80 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
29c90 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
29ca0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29cb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c  }.#endif.    rel
29cc0 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
29cd0 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f  ;.  }.end_shallo
29ce0 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c  w_balance:.  sql
29cf0 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c  ite3_free(apCell
29d00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29d10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f  }.../*.** The ro
29d20 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  ot page is overf
29d30 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ull.**.** When t
29d40 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65  his happens, Cre
29d50 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
29d60 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68  page and copy th
29d70 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
29d80 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74   the root into t
29d90 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20  he child.  Then 
29da0 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  make the root.**
29db0 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70   page an empty p
29dc0 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68  age with rightCh
29dd0 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ild pointing to 
29de0 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64  the new.** child
29df0 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c  .   Finally, cal
29e00 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e  l balance_intern
29e10 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  al() on the new 
29e20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73  child.** to caus
29e30 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a  e it to split..*
29e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
29e50 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
29e60 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
29e70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29e80 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
29e90 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
29ea0 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
29eb0 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f  ge *pChild;    /
29ec0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
29ed0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
29ee0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
29ef0 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  d;     /* Page n
29f00 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
29f10 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
29f20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
29f30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
29f40 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Tree */.  int us
29f50 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  ableSize;     /*
29f60 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69   Total usable si
29f70 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a  ze of a page */.
29f80 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
29f90 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
29fa0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
29fb0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61  age */.  u8 *cda
29fc0 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
29fd0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  Content of the c
29fe0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  hild page */.  i
29ff0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
2a000 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2a010 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70  page header in p
2a020 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62  arent */.  int b
2a030 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rk;            /
2a040 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74  * Offset to cont
2a050 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ent of first cel
2a060 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a  l in parent */..
2a070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a080 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20  >pParent==0 );. 
2a090 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a0a0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
2a0b0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2a0c0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2a0d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a0e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a0f0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2a100 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43  reePage(pBt, &pC
2a110 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64  hild, &pgnoChild
2a120 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30  , pPage->pgno, 0
2a130 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2a140 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
2a150 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2a160 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
2a170 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
2a180 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
2a190 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
2a1a0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2a1b0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
2a1c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2a1d0 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65    brk = get2byte
2a1e0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
2a1f0 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64    cdata = pChild
2a200 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70  ->aData;.  memcp
2a210 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68  y(cdata, &data[h
2a220 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c  dr], pPage->cell
2a230 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
2a240 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65  nCell-hdr);.  me
2a250 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d  mcpy(&cdata[brk]
2a260 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
2a270 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20  ableSize-brk);. 
2a280 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2a290 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
2a2a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2a2b0 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64  eInitPage(pChild
2a2c0 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  , pPage);.  if( 
2a2d0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2a2e0 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d  edeeper_out;.  m
2a2f0 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
2a300 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66  vfl, pPage->aOvf
2a310 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  l, pPage->nOverf
2a320 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65  low*sizeof(pPage
2a330 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
2a340 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2a350 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  w = pPage->nOver
2a360 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69  flow;.  if( pChi
2a370 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
2a380 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72  .    pChild->nFr
2a390 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ee = 0;.  }.  as
2a3a0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
2a3b0 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ell==pPage->nCel
2a3c0 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  l );.  zeroPage(
2a3d0 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2a3e0 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
2a3f0 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
2a400 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2a410 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2a420 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
2a430 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2a440 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
2a450 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67  into %d\n", pPag
2a460 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  e->pgno, pChild-
2a470 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66  >pgno));.#ifndef
2a480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2a490 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
2a4a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2a4b0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2a4c0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2a4d0 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  Bt, pChild->pgno
2a4e0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2a4f0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
2a500 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2a510 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
2a520 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
2a530 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
2a540 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
2a550 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
2a560 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20  pChild, i);.    
2a570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2a590 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a5a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
2a5b0 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  if.  rc = balanc
2a5c0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64  e_nonroot(pChild
2a5d0 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65  );..balancedeepe
2a5e0 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  r_out:.  release
2a5f0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2a600 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a610 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74 68  .** Decide if th
2a620 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65 65  e page pPage nee
2a630 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
2a640 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67  d.  If balancing
2a650 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c   is.** required,
2a660 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70   call the approp
2a670 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
2a680 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
2a690 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d  ic int balance(M
2a6a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2a6b0 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e  nt insert){.  in
2a6c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a6d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a6e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a6f0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2a700 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
2a710 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a  ->pParent==0 ){.
2a720 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a730 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2a740 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2a750 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a760 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
2a770 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
2a780 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65   rc = balance_de
2a790 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20  eper(pPage);.   
2a7a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2a7b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2a7c0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
2a7d0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2a7e0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67  e_shallower(pPag
2a7f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
2a800 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
2a810 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
2a820 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73 65   .        (!inse
2a830 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  rt && pPage->nFr
2a840 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ee>pPage->pBt->u
2a850 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29  sableSize*2/3) )
2a860 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2a870 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61  ance_nonroot(pPa
2a880 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
2a890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a8a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a8b0 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72  e checks all cur
2a8c0 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20  sors that point 
2a8d0 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f  to table pgnoRoo
2a8e0 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  t..** If any of 
2a8f0 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65  those cursors we
2a900 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  re opened with w
2a910 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69  rFlag==0 in a di
2a920 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  fferent.** datab
2a930 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28  ase connection (
2a940 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2a950 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65  ction that share
2a960 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  s the pager.** c
2a970 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75  ache with the cu
2a980 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
2a990 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72  ) and that other
2a9a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
2a9b0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65  is not in the Re
2a9c0 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73  adUncommmitted s
2a9d0 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20  tate, then this 
2a9e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2a9f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .** SQLITE_LOCKE
2aa00 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69  D..**.** In addi
2aa10 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67  tion to checking
2aa20 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20   for read-locks 
2aa30 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c 6f  (where a read-lo
2aa40 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63  ck .** means a c
2aa50 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69 74  ursor opened wit
2aa60 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68 69  h wrFlag==0) thi
2aa70 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d  s routine also m
2aa80 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74  oves.** all writ
2aa90 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61  e cursors so tha
2aaa0 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  t they are point
2aab0 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
2aac0 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65  irst Cell on the
2aad0 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69   root page.  Thi
2aae0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
2aaf0 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74  ecause an insert
2ab00 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d   .** or delete m
2ab10 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
2ab20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2ab30 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c  on a page or del
2ab40 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e  ete.** a page en
2ab50 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f  tirely and we do
2ab60 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61   not want to lea
2ab70 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a  ve any cursors .
2ab80 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e  ** pointing to n
2ab90 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65  on-existant page
2aba0 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  s or cells..*/.s
2abb0 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
2abc0 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  eadLocks(Btree *
2abd0 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e  pBtree, Pgno pgn
2abe0 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  oRoot, BtCursor 
2abf0 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74  *pExclude){.  Bt
2ac00 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53  Cursor *p;.  BtS
2ac10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74  hared *pBt = pBt
2ac20 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  ree->pBt;.  sqli
2ac30 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65  te3 *db = pBtree
2ac40 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
2ac50 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2ac60 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29  sMutex(pBtree) )
2ac70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
2ac80 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
2ac90 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
2aca0 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f  p==pExclude ) co
2acb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2acc0 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  p->eState!=CURSO
2acd0 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e  R_VALID ) contin
2ace0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ue;.    if( p->p
2acf0 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f  gnoRoot!=pgnoRoo
2ad00 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2ad10 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d    if( p->wrFlag=
2ad20 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2ad30 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70  te3 *dbOther = p
2ad40 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
2ad50 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d      if( dbOther=
2ad60 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28  =0 ||.         (
2ad70 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28  dbOther!=db && (
2ad80 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26  dbOther->flags &
2ad90 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2ada0 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a  mmitted)==0) ){.
2adb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2adc0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
2add0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2ade0 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67  if( p->pPage->pg
2adf0 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20  no!=p->pgnoRoot 
2ae00 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52  ){.      moveToR
2ae10 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  oot(p);.    }.  
2ae20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2ae30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
2ae40 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
2ae50 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
2ae60 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
2ae70 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
2ae80 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
2ae90 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
2aea0 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
2aeb0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
2aec0 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
2aed0 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
2aee0 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
2aef0 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
2af00 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
2af10 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
2af20 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
2af30 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
2af40 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
2af50 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
2af60 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
2af70 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
2af80 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
2af90 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
2afa0 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
2afb0 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
2afc0 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
2afd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2afe0 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
2aff0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2b000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b010 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
2b020 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
2b030 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2b040 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2b050 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2b060 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
2b070 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
2b080 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2b090 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
2b0a0 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
2b0b0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2b0c0 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b0e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
2b0f0 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
2b100 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
2b110 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20   int appendBias 
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b130 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2b140 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
2b150 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
2b160 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
2b170 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65   int szNew;.  Me
2b180 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2b190 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
2b1a0 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
2b1b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2b1c0 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2b1d0 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
2b1e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
2b1f0 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  wCell = 0;..  as
2b200 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2b210 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2b220 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2b230 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2b240 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2b250 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2b260 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2b270 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20  doing an insert 
2b280 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2b290 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2b2a0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2b2b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2b2c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2b2d0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2b2e0 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
2b2f0 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2b300 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b310 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43  ITE_PERM;   /* C
2b320 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66  ursor not open f
2b330 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2b340 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2b350 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2b360 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2b370 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20  oot, pCur) ){.  
2b380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b390 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
2b3a0 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
2b3b0 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
2b3c0 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ock */.  }.  if(
2b3d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b3e0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
2b3f0 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
2b400 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  skip;.  }..  /* 
2b410 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
2b420 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
2b430 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2b440 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
2b450 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
2b460 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
2b470 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21   .    SQLITE_OK!
2b480 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
2b490 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
2b4a0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2b4b0 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f  ) ||.    SQLITE_
2b4c0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
2b4d0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75  3BtreeMoveto(pCu
2b4e0 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61  r, pKey, nKey, a
2b4f0 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29  ppendBias, &loc)
2b500 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2b510 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  n rc;.  }..  pPa
2b520 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2b530 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b540 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
2b550 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
2b560 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
2b570 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74   !pPage->leafDat
2b580 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49  a );.  TRACE(("I
2b590 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20  NSERT: table=%d 
2b5a0 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d  nkey=%lld ndata=
2b5b0 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22  %d page=%d %s\n"
2b5c0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ,.          pCur
2b5d0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79  ->pgnoRoot, nKey
2b5e0 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  , nData, pPage->
2b5f0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
2b600 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72  loc==0 ? "overwr
2b610 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72  ite" : "new entr
2b620 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y"));.  assert( 
2b630 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2b640 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c  .  newCell = sql
2b650 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 4d 58 5f  ite3_malloc( MX_
2b660 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
2b670 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d  ;.  if( newCell=
2b680 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2b690 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d  TE_NOMEM;.  rc =
2b6a0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67   fillInCell(pPag
2b6b0 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79  e, newCell, pKey
2b6c0 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e  , nKey, pData, n
2b6d0 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a  Data, nZero, &sz
2b6e0 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29  New);.  if( rc )
2b6f0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2b700 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
2b710 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  w==cellSizePtr(p
2b720 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29  Page, newCell) )
2b730 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
2b740 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w<=MX_CELL_SIZE(
2b750 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f  pBt) );.  if( lo
2b760 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
2b770 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2b780 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  te ){.    u16 sz
2b790 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
2b7a0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
2b7b0 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
2b7c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
2b7d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b7e0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2b7f0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2b800 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
2b810 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
2b820 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20  }.    oldCell = 
2b830 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2b840 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20  pCur->idx);.    
2b850 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2b860 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
2b870 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
2b880 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
2b890 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
2b8a0 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
2b8b0 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
2b8c0 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2b8d0 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  oldCell);.    if
2b8e0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2b8f0 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f 70  insert;.    drop
2b900 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b910 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20  ->idx, szOld);. 
2b920 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
2b930 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
2b940 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
2b950 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2b960 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b  .    pCur->idx++
2b970 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
2b980 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65  .nSize = 0;.  }e
2b990 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2b9a0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2b9b0 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72    }.  rc = inser
2b9c0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2b9d0 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  r->idx, newCell,
2b9e0 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
2b9f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ba00 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  OK ) goto end_in
2ba10 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c  sert;.  rc = bal
2ba20 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b 0a  ance(pPage, 1);.
2ba30 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65    /* sqlite3Btre
2ba40 65 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d 3e  ePageDump(pCur->
2ba50 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2ba60 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a  oot, 1); */.  /*
2ba70 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
2ba80 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2ba90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
2baa0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2bab0 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a  .  }.end_insert:
2bac0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2bad0 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  newCell);.  retu
2bae0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2baf0 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
2bb00 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2bb10 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
2bb20 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2bb30 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2bb40 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2bb50 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
2bb60 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2bb70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2bb80 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2bb90 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2bba0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2bbb0 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
2bbc0 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43  rc;.  Pgno pgnoC
2bbd0 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65  hild = 0;.  Btre
2bbe0 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
2bbf0 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
2bc00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
2bc10 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2bc20 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2bc30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2bc40 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2bc50 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2bc60 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2bc70 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2bc80 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2bc90 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64  saction before d
2bca0 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f  oing a delete */
2bcb0 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2bcc0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2bcd0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2bce0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2bcf0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2bd00 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2bd10 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70  dOnly );.  if( p
2bd20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2bd30 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2bd40 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
2bd50 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  ip;.  }.  if( pC
2bd60 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65  ur->idx >= pPage
2bd70 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72  ->nCell ){.    r
2bd80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2bd90 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73  OR;  /* The curs
2bda0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2bdb0 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a  ng to anything *
2bdc0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75  /.  }.  if( !pCu
2bdd0 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
2bde0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2bdf0 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f  ERM;   /* Did no
2be00 74 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73  t open this curs
2be10 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a  or for writing *
2be20 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63  /.  }.  if( chec
2be30 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d  kReadLocks(pCur-
2be40 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
2be50 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29  gnoRoot, pCur) )
2be60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2be70 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2be80 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2be90 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2bea0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
2beb0 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
2bec0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2bed0 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f  position (a no-o
2bee0 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  p if the cursor 
2bef0 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20  is not in .  ** 
2bf00 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2bf10 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61  EK state) and sa
2bf20 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2bf30 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2bf40 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e  rsors .  ** open
2bf50 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
2bf60 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71  le. Then call sq
2bf70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2bf80 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  ) on the page.  
2bf90 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ** that the entr
2bfa0 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  y will be delete
2bfb0 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69  d from..  */.  i
2bfc0 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65  f( .    (rc = re
2bfd0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2bfe0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2bff0 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
2c000 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2c010 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
2c020 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20  Root, pCur))!=0 
2c030 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c  ||.    (rc = sql
2c040 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c050 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2c060 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2c070 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2c080 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
2c090 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65   within its page
2c0a0 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c   and leave pCell
2c0b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2c0c0 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20  .  ** data. The 
2c0d0 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c  clearCell() call
2c0e0 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66   frees any overf
2c0f0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2c100 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
2c110 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c  ** cell. The cel
2c120 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c  l itself is stil
2c130 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20  l intact..  */. 
2c140 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2c150 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2c160 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  dx);.  if( !pPag
2c170 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
2c180 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2c190 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  yte(pCell);.  }.
2c1a0 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2c1b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2c1c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2c1d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2c1e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2c1f0 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
2c200 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
2c210 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
2c220 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
2c230 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
2c240 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
2c250 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
2c260 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
2c270 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
2c280 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
2c290 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
2c2a0 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
2c2b0 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
2c2c0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
2c2d0 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
2c2e0 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
2c2f0 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
2c300 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
2c310 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
2c320 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
2c330 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
2c340 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
2c350 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2c360 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
2c370 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
2c380 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2c390 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
2c3a0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2c3b0 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20  ->leafData );.  
2c3c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
2c3d0 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72  tTempCursor(pCur
2c3e0 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20  , &leafCur);.   
2c3f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2c400 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
2c410 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
2c420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c430 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2c440 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c450 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  e(leafCur.pPage-
2c460 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
2c470 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c490 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20  u16 szNext;.    
2c4a0 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
2c4b0 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
2c4c0 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20  e internal from 
2c4d0 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20  %d replace from 
2c4e0 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2c4f0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2c500 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2c510 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  , leafCur.pPage-
2c520 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64  >pgno));.      d
2c530 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2c540 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2c550 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2c560 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
2c570 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61  t = findCell(lea
2c580 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
2c590 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20  Cur.idx);.      
2c5a0 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a  szNext = cellSiz
2c5b0 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61  ePtr(leafCur.pPa
2c5c0 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20  ge, pNext);.    
2c5d0 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
2c5e0 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e  L_SIZE(pBt)>=szN
2c5f0 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 74  ext+4 );.      t
2c600 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65  empCell = sqlite
2c610 33 5f 6d 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c  3_malloc( MX_CEL
2c620 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
2c630 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c       if( tempCel
2c640 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
2c650 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2c660 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
2c670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c680 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2c690 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2c6a0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2c6b0 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
2c6c0 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
2c6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c6e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
2c700 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
2c710 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  wCell(pPage, pCu
2c720 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69  r->idx), pgnoChi
2c730 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ld);.        rc 
2c740 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2c750 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2c760 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c770 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c780 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72  dropCell(leafCur
2c790 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
2c7a0 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20  idx, szNext);.  
2c7b0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2c7c0 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ce(leafCur.pPage
2c7d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2c7e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2c7f0 66 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a  free(tempCell);.
2c800 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2c810 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  ReleaseTempCurso
2c820 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d  r(&leafCur);.  }
2c830 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28  else{.    TRACE(
2c840 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
2c850 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c  %d delete from l
2c860 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
2c870 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2c880 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
2c890 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
2c8a0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2c8b0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2c8c0 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
2c8d0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2c8e0 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ge, 0);.  }.  if
2c8f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c900 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2c910 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72  t(pCur);.  }.  r
2c920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c930 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2c940 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72  BTree table.  Wr
2c950 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c  ite into *piTabl
2c960 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  e the page.** nu
2c970 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f  mber for the roo
2c980 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
2c990 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  w table..**.** T
2c9a0 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20  he type of type 
2c9b0 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
2c9c0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2c9d0 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  eter.  Only the.
2c9e0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  ** following val
2c9f0 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65  ues of flags are
2ca00 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
2ca10 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73  e.  Other values
2ca20 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69   for.** flags mi
2ca30 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a  ght not work:.**
2ca40 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e  .**     BTREE_IN
2ca50 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44  TKEY|BTREE_LEAFD
2ca60 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72  ATA     Used for
2ca70 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68   SQL tables with
2ca80 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20   rowid keys.**  
2ca90 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54     BTREE_ZERODAT
2caa0 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A               
2cab0 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
2cac0 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69  indices.*/.stati
2cad0 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74  c int btreeCreat
2cae0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
2caf0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
2cb00 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53  nt flags){.  BtS
2cb10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2cb20 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
2cb30 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67  pRoot;.  Pgno pg
2cb40 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  noRoot;.  int rc
2cb50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2cb60 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
2cb70 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
2cb80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2cb90 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2cba0 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2cbb0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2cbc0 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20  on first */.    
2cbd0 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2cbe0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2cbf0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2cc00 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
2cc10 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2cc20 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
2cc30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
2cc40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2cc50 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
2cc60 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2cc70 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
2cc80 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
2cc90 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
2cca0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  n rc;.  }.#else.
2ccb0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2ccc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
2ccd0 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
2cce0 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
2ccf0 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
2cd00 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
2cd10 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
2cd20 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
2cd30 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
2cd40 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
2cd50 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77  * Creating a new
2cd60 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61   table may proba
2cd70 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  bly require movi
2cd80 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64  ng an existing d
2cd90 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74  atabase.    ** t
2cda0 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
2cdb0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72  the new tables r
2cdc0 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73  oot page. In cas
2cdd0 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e  e this page turn
2cde0 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  s.    ** out to 
2cdf0 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
2ce00 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20  age, delete all 
2ce10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61  overflow page-ma
2ce20 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20  p caches.    ** 
2ce30 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72  held by open cur
2ce40 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sors..    */.   
2ce50 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
2ce60 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
2ce70 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
2ce80 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
2ce90 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
2cea0 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
2ceb0 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
2cec0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
2ced0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
2cee0 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
2cef0 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
2cf00 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2cf10 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
2cf20 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
2cf30 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
2cf40 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
2cf50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2cf60 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2cf70 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
2cf80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cf90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2cfa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2cfb0 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
2cfc0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
2cfd0 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
2cfe0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
2cff0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
2d000 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
2d010 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
2d020 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ge..    */.    w
2d030 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d  hile( pgnoRoot==
2d040 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2d050 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
2d060 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
2d070 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2d080 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2d090 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
2d0a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2d0b0 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
2d0c0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
2d0d0 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
2d0e0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
2d0f0 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
2d100 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
2d110 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
2d120 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
2d130 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
2d140 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
2d150 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
2d160 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
2d170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2d180 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2d190 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
2d1a0 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
2d1b0 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
2d1c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d1d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2d1e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2d1f0 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
2d200 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
2d210 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
2d220 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
2d230 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
2d240 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
2d250 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
2d260 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
2d270 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
2d280 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
2d290 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
2d2a0 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
2d2b0 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
2d2c0 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
2d2d0 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
2d2e0 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
2d2f0 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
2d300 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2d310 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
2d320 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
2d330 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
2d340 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
2d350 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
2d360 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
2d370 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
2d380 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
2d390 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
2d3a0 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
2d3b0 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
2d3c0 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
2d3d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d3e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
2d3f0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
2d400 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
2d410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d420 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2d430 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2d440 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2d450 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
2d460 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
2d470 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2d480 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2d490 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
2d4a0 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70  ROOTPAGE || eTyp
2d4b0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
2d4c0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  GE ){.        re
2d4d0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2d4e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d4f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2d500 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2d510 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
2d520 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
2d530 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
2d540 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20  _FREEPAGE );.   
2d550 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2d560 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
2d570 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2d580 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2d5a0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2d5b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d5c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2d5d0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
2d5e0 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c  Page(pBt, pRoot,
2d5f0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
2d600 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20  , pgnoMove);.   
2d610 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d620 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Root);..      /*
2d630 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   Obtain the page
2d640 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a   at pgnoRoot */.
2d650 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d680 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2d690 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2d6a0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
2d6b0 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
2d6c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d6d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d6e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2d700 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d710 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
2d720 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2d730 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d740 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2d750 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2d760 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d770 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2d780 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70  .      pRoot = p
2d790 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20  PageMove;.    } 
2d7a0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
2d7b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2d7c0 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69  and meta-data wi
2d7d0 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  th the new root-
2d7e0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  page number. */.
2d7f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2d800 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ut(pBt, pgnoRoot
2d810 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
2d820 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
2d830 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
2d840 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2d850 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d860 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
2d870 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
2d880 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f  eMeta(p, 4, pgno
2d890 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
2d8a0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
2d8b0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2d8c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d8d0 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
2d8e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2d8f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2d900 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
2d910 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 1, 0);.    if
2d920 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2d930 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  ;.  }.#endif.  a
2d940 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d950 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d960 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
2d970 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  ;.  zeroPage(pRo
2d980 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f  ot, flags | PTF_
2d990 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  LEAF);.  sqlite3
2d9a0 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74  PagerUnref(pRoot
2d9b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  ->pDbPage);.  *p
2d9c0 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67  iTable = (int)pg
2d9d0 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e  noRoot;.  return
2d9e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
2d9f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  t sqlite3BtreeCr
2da00 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
2da10 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
2da20 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2da30 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
2da40 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
2da50 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
2da60 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
2da70 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c  eeCreateTable(p,
2da80 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   piTable, flags)
2da90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2daa0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2dab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2dac0 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20  Erase the given 
2dad0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e  database page an
2dae0 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72  d all its childr
2daf0 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  en.  Return.** t
2db00 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
2db10 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  reelist..*/.stat
2db20 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61  ic int clearData
2db30 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68  basePage(.  BtSh
2db40 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
2db50 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
2db60 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2db70 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  the table */.  P
2db80 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
2db90 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2dba0 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a  ber to clear */.
2dbb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
2dbc0 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  nt,     /* Paren
2dbd0 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f  t page.  NULL fo
2dbe0 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20  r the root */.  
2dbf0 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67  int freePageFlag
2dc00 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63        /* Dealloc
2dc10 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65  ate page if true
2dc20 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
2dc30 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
2dc40 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
2dc50 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
2dc60 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
2dc70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2dc80 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2dc90 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ) );.  if( pgno>
2dca0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2dcb0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
2dcc0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
2dcd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2dce0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
2dcf0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2dd00 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
2dd10 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
2dd20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2dd30 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2dd40 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
2dd50 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
2dd60 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
2dd70 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2dd80 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
2dd90 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2dda0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2ddb0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2ddc0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
2ddd0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c   pPage->pParent,
2dde0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
2ddf0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2de00 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2de10 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
2de20 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2de30 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
2de40 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2de50 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2de60 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
2de70 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2de80 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2de90 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2dea0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2deb0 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50  a[8]), pPage->pP
2dec0 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69  arent, 1);.    i
2ded0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2dee0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2def0 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  ut;.  }.  if( fr
2df00 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20  eePageFlag ){.  
2df10 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2df20 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20  pPage);.  }else 
2df30 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
2df40 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2df50 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20  e->pDbPage))==0 
2df60 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  ){.    zeroPage(
2df70 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44  pPage, pPage->aD
2df80 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41  ata[0] | PTF_LEA
2df90 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61  F);.  }..clearda
2dfa0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a  tabasepage_out:.
2dfb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2dfc0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
2dfd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2dfe0 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  te all informati
2dff0 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  on from a single
2e000 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
2e010 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20  tabase.  iTable 
2e020 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  is.** the page n
2e030 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  umber of the roo
2e040 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
2e050 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
2e060 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20  ine returns,.** 
2e070 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2e080 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c   empty, but stil
2e090 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  l exists..**.** 
2e0a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2e0b0 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
2e0c0 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
2e0d0 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
2e0e0 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ** read cursors 
2e0f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f  on the table.  O
2e100 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
2e110 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
2e120 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68  he.** root of th
2e130 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  e table..*/.int 
2e140 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2e150 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  rTable(Btree *p,
2e160 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
2e170 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
2e180 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2e190 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2e1a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
2e1b0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
2e1c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
2e1d0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2e1e0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2e1f0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2e200 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2e210 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
2e220 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b 52 65  f( (rc = checkRe
2e230 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
2e240 65 2c 20 30 29 29 21 3d 53 51 4c 49 54 45 5f 4f  e, 0))!=SQLITE_O
2e250 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68  K ){.    /* noth
2e260 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d  ing to do */.  }
2e270 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f  else if( SQLITE_
2e280 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
2e290 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54  lCursors(pBt, iT
2e2a0 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  able, 0)) ){.   
2e2b0 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
2e2c0 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o */.  }else{.  
2e2d0 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2e2e0 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50  basePage(pBt, (P
2e2f0 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30  gno)iTable, 0, 0
2e300 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2e310 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2e320 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e330 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
2e340 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
2e350 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
2e360 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2e370 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
2e380 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
2e390 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
2e3a0 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
2e3b0 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
2e3c0 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
2e3d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2e3e0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
2e3f0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2e400 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2e410 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2e420 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2e430 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
2e440 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
2e450 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
2e460 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
2e470 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
2e480 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
2e490 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
2e4a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2e4b0 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
2e4c0 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
2e4d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e4e0 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   is moved into t
2e4f0 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  he slot formerly
2e500 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20   occupied by.** 
2e510 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20  iTable and that 
2e520 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72  last slot former
2e530 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74  ly occupied by t
2e540 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2e550 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  e.** is added to
2e560 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
2e570 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e  stead of iTable.
2e580 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61    In this say, a
2e590 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
2e5a0 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65   are kept at the
2e5b0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2e5c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2e5d0 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63   which.** is nec
2e5e0 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56  essary for AUTOV
2e5f0 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69  ACUUM to work ri
2e600 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69  ght.  *piMoved i
2e610 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2e620 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
2e630 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65  t used to be the
2e640 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
2e650 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  in the file befo
2e660 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20  re.** the move. 
2e670 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73   If no page gets
2e680 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64   moved, *piMoved
2e690 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
2e6a0 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   The last root p
2e6b0 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20  age is recorded 
2e6c0 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74  in meta[3] and t
2e6d0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d  he value of.** m
2e6e0 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65  eta[3] is update
2e6f0 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
2e700 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
2e710 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c  nt btreeDropTabl
2e720 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2e730 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d  iTable, int *piM
2e740 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
2e750 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2e760 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  e = 0;.  BtShare
2e770 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2e780 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2e790 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2e7a0 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70  ex(p) );.  if( p
2e7b0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2e7c0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2e7d0 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2e7e0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2e7f0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2e800 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ROR;.  }..  /* I
2e810 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
2e820 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20  drop a table if 
2e830 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20  any cursors are 
2e840 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  open on the.  **
2e850 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
2e860 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75  is because in au
2e870 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
2e880 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20  he backend may. 
2e890 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65   ** need to move
2e8a0 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61   another root-pa
2e8b0 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70  ge to fill a gap
2e8c0 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
2e8d0 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70  eted.  ** root p
2e8e0 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20  age. If an open 
2e8f0 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
2e900 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f   this page a pro
2e910 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  blem would .  **
2e920 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69   occur..  */.  i
2e930 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  f( pBt->pCursor 
2e940 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2e950 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
2e960 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2e970 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
2e980 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
2e990 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  &pPage, 0);.  if
2e9a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2e9b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2e9c0 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
2e9d0 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66  p, iTable);.  if
2e9e0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65  ( rc ){.    rele
2e9f0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2ea00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ea10 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d   }..  *piMoved =
2ea20 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c   0;..  if( iTabl
2ea30 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51  e>1 ){.#ifdef SQ
2ea40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2ea50 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72  CUUM.    rc = fr
2ea60 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2ea70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ea80 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  Page);.#else.   
2ea90 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2eaa0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67  cuum ){.      Pg
2eab0 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a  no maxRootPgno;.
2eac0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ead0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2eae0 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e  , 4, &maxRootPgn
2eaf0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2eb00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2eb10 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2eb20 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2eb30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2eb40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2eb50 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74   iTable==maxRoot
2eb60 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
2eb70 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
2eb80 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73  being dropped is
2eb90 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
2eba0 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2ebb0 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
2ebc0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
2ebd0 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68 65  atabase, put the
2ebe0 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68   root page on th
2ebf0 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20  e free list. .  
2ec00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ec10 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2ec20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2ec30 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2ec40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ec50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ec60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ec70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2ec80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ec90 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2eca0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64   being dropped d
2ecb0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65  oes not have the
2ecc0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
2ecd0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
2ece0 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
2ecf0 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68  base. So move th
2ed00 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  e page that does
2ed10 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20   into the .     
2ed20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62     ** gap left b
2ed30 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f  y the deleted ro
2ed40 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ot-page..       
2ed50 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   */.        MemP
2ed60 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20  age *pMove;.    
2ed70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ed80 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2ed90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2eda0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
2edb0 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
2edc0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2edd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ede0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2edf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2ee00 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2ee10 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2ee20 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f  , pMove, PTRMAP_
2ee30 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61  ROOTPAGE, 0, iTa
2ee40 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ble);.        re
2ee50 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
2ee60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2ee70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ee80 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2ee90 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2eea0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2eeb0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2eec0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2eed0 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
2eee0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2eef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ef00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ef10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ef20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2ef30 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
2ef40 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
2ef50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ef60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ef70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ef80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2ef90 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
2efa0 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
2efb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2efc0 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
2efd0 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
2efe0 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
2eff0 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
2f000 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2f010 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
2f020 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
2f030 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
2f040 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
2f050 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
2f060 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
2f070 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
2f080 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
2f090 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
2f0a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
2f0b0 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
2f0c0 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
2f0d0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
2f0e0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2f0f0 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
2f100 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
2f110 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
2f120 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
2f130 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  O(pBt, maxRootPg
2f140 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  no) ){.        m
2f150 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2f160 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2f170 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21  rt( maxRootPgno!
2f180 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2f190 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  GE(pBt) );..    
2f1a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f1b0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
2f1c0 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29   4, maxRootPgno)
2f1d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f1e0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2f1f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  (pPage);.      r
2f200 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2f210 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2f220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2f230 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  If sqlite3BtreeD
2f240 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c  ropTable was cal
2f250 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  led on page 1. *
2f260 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  /.    zeroPage(p
2f270 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59  Page, PTF_INTKEY
2f280 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20  |PTF_LEAF );.   
2f290 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2f2a0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
2f2b0 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
2f2c0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
2f2d0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2f2e0 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
2f2f0 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
2f300 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
2f310 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
2f320 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
2f330 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f  .  rc = btreeDro
2f340 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  pTable(p, iTable
2f350 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71  , piMoved);.  sq
2f360 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2f370 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2f380 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
2f390 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  the meta-informa
2f3a0 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61  tion out of a da
2f3b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65  tabase file.  Me
2f3c0 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20  ta[0].** is the 
2f3d0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  number of free p
2f3e0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
2f3f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2f400 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f   Meta[1].** thro
2f410 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65  ugh meta[15] are
2f420 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
2f430 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79  se by higher lay
2f440 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a  ers.  Meta[0].**
2f450 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74   is read-only, t
2f460 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65  he others are re
2f470 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a  ad/write..** .**
2f480 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65   The schema laye
2f490 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76  r numbers meta v
2f4a0 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c  alues differentl
2f4b0 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d  y.  At the schem
2f4c0 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20  a.** layer (and 
2f4d0 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e  the SetCookie an
2f4e0 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63  d ReadCookie opc
2f4f0 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72  odes) the number
2f500 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65   of.** free page
2f510 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  s is not visible
2f520 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20  .  So Cookie[0] 
2f530 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d  is the same as M
2f540 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73  eta[1]..*/.int s
2f550 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2f560 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
2f570 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61   idx, u32 *pMeta
2f580 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
2f590 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
2f5a0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2f5b0 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64  *pP1;.  BtShared
2f5c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2f5d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
2f5e0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
2f5f0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
2f600 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61  * Reading a meta
2f610 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75  -data value requ
2f620 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
2f630 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20   on page 1 (and 
2f640 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73  hence.  ** the s
2f650 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
2f660 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73  le. We grab this
2f670 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73   lock regardless
2f680 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20   of whether or. 
2f690 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49   ** not the SQLI
2f6a0 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2f6b0 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28  ed flag is set (
2f6c0 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
2f6d0 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20   at page.  ** 1 
2f6e0 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20  is treated as a 
2f6f0 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20  special case by 
2f700 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
2f710 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29   and lockTable()
2f720 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71  )..  */.  rc = q
2f730 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
2f740 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
2f750 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f760 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2f770 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2f780 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2f790 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
2f7a0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
2f7b0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2f7c0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
2f7d0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50  pPager, 1, &pDbP
2f7e0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2f7f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
2f800 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
2f810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2f820 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64   pP1 = (unsigned
2f830 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
2f840 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
2f850 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d  age);.  *pMeta =
2f860 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b 33   get4byte(&pP1[3
2f870 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73  6 + idx*4]);.  s
2f880 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2f890 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  (pDbPage);..  /*
2f8a0 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64   If autovacuumed
2f8b0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
2f8c0 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77  this build but w
2f8d0 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
2f8e0 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20  .  ** access an 
2f8f0 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74  autovacuumed dat
2f900 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65  abase, then make
2f910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
2f920 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69  adonly. .  */.#i
2f930 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2f940 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
2f950 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65  ( idx==4 && *pMe
2f960 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64  ta>0 ) pBt->read
2f970 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  Only = 1;.#endif
2f980 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
2f990 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
2f9a0 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c  e 1. */.  rc = l
2f9b0 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52  ockTable(p, 1, R
2f9c0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c  EAD_LOCK);.  sql
2f9d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2f9e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2f9f0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d  }../*.** Write m
2fa00 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
2fa10 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
2fa20 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d  tabase.  Meta[0]
2fa30 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79   is.** read-only
2fa40 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20   and may not be 
2fa50 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  written..*/.int 
2fa60 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2fa70 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  teMeta(Btree *p,
2fa80 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d   int idx, u32 iM
2fa90 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64  eta){.  BtShared
2faa0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2fab0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2fac0 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pP1;.  int rc;.
2fad0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31    assert( idx>=1
2fae0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2faf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2fb00 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
2fb10 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
2fb20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2fb30 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2fb40 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2fb50 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2fb60 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2fb70 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
2fb80 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
2fb90 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70  age1!=0 );.    p
2fba0 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
2fbb0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
2fbc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2fbd0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
2fbe0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2fbf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fc00 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2fc10 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
2fc20 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66  *4], iMeta);.#if
2fc30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2fc40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2fc50 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a    if( idx==7 ){.
2fc60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fc70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2fc80 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20  || iMeta==0 );. 
2fc90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2fca0 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61  Meta==0 || iMeta
2fcb0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
2fcc0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
2fcd0 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a   iMeta;.      }.
2fce0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
2fcf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
2fd00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
2fd10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2fd20 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
2fd30 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
2fd40 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
2fd50 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2fd60 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
2fd70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
2fd80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2fd90 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
2fda0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
2fdb0 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
2fdc0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2fdd0 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
2fde0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
2fdf0 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ** restoreOrClea
2fe00 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2fe10 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d  ) here..  */.  M
2fe20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2fe30 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2fe40 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2fe50 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
2fe60 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2fe70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2fe80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2fe90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2fea0 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20  >pBt==pCur->pBt 
2feb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
2fec0 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
2fed0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2fee0 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  t] : 0;.}.../*.*
2fef0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
2ff00 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
2ff10 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69  th a BTree.  Thi
2ff20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2ff30 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2ff40 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2ff50 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73  nly..*/.Pager *s
2ff60 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
2ff70 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
2ff80 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61  turn p->pBt->pPa
2ff90 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ger;.}..#ifndef 
2ffa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
2ffb0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
2ffc0 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
2ffd0 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
2ffe0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
2fff0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
30000 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
30010 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
30020 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
30030 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
30040 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
30050 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
30060 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 32  p;.  char *zMsg2
30070 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d  ;.  if( !pCheck-
30080 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b  >mxErr ) return;
30090 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  .  pCheck->mxErr
300a0 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45  --;.  pCheck->nE
300b0 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74  rr++;.  va_start
300c0 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
300d0 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65 33   zMsg2 = sqlite3
300e0 56 4d 50 72 69 6e 74 66 28 30 2c 20 7a 46 6f 72  VMPrintf(0, zFor
300f0 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
30100 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d  nd(ap);.  if( zM
30110 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d  sg1==0 ) zMsg1 =
30120 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63   "";.  if( pChec
30130 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  k->zErrMsg ){.  
30140 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70    char *zOld = p
30150 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a  Check->zErrMsg;.
30160 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72      pCheck->zErr
30170 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Msg = 0;.    sql
30180 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
30190 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20  Check->zErrMsg, 
301a0 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67  zOld, "\n", zMsg
301b0 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a  1, zMsg2, (char*
301c0 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )0);.    sqlite3
301d0 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d  _free(zOld);.  }
301e0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
301f0 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65  3SetString(&pChe
30200 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73  ck->zErrMsg, zMs
30210 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72  g1, zMsg2, (char
30220 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  *)0);.  }.  sqli
30230 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 32 29 3b  te3_free(zMsg2);
30240 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
30250 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
30260 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
30270 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30280 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
30290 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20  ./*.** Add 1 to 
302a0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
302b0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61  unt for page iPa
302c0 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ge.  If this is 
302d0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65  the second.** re
302e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
302f0 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f  age, add an erro
30300 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68  r message to pCh
30310 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  eck->zErrMsg..**
30320 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
30330 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72  re are 2 ore mor
30340 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
30350 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69  the page and 0 i
30360 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  f.** if this is 
30370 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65  the first refere
30380 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e  nce to the page.
30390 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63  .**.** Also chec
303a0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
303b0 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75  number is in bou
303c0 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nds..*/.static i
303d0 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65  nt checkRef(Inte
303e0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
303f0 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72   int iPage, char
30400 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69   *zContext){.  i
30410 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
30420 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50  turn 1;.  if( iP
30430 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67  age>pCheck->nPag
30440 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a  e || iPage<0 ){.
30450 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30460 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30470 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61  ext, "invalid pa
30480 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69  ge number %d", i
30490 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
304a0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
304b0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
304c0 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68  ge]==1 ){.    ch
304d0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
304e0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
304f0 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f  2nd reference to
30500 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
30510 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
30520 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28  .  }.  return  (
30530 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
30540 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69  age]++)>1;.}..#i
30550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30560 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
30570 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
30580 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  e entry in the p
30590 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70  ointer-map for p
305a0 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20  age iChild maps 
305b0 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72  to .** page iPar
305c0 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70  ent, pointer typ
305d0 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f  e ptrType. If no
305e0 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72  t, append an err
305f0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f  or message.** to
30600 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74   pCheck..*/.stat
30610 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72  ic void checkPtr
30620 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79  map(.  Integrity
30630 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a  Ck *pCheck,   /*
30640 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
30650 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67   context */.  Pg
30660 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
30670 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61       /* Child pa
30680 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75  ge number */.  u
30690 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
306a0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
306b0 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79  d pointer map ty
306c0 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61  pe */.  Pgno iPa
306d0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f  rent,          /
306e0 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
306f0 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61  er map parent pa
30700 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
30710 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
30720 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
30730 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73   description (us
30740 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67  ed for error msg
30750 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
30760 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79  ;.  u8 ePtrmapTy
30770 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d  pe;.  Pgno iPtrm
30780 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20  apParent;..  rc 
30790 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65  = ptrmapGet(pChe
307a0 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c  ck->pBt, iChild,
307b0 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26   &ePtrmapType, &
307c0 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
307d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
307e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  _OK ){.    check
307f0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30800 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69  , zContext, "Fai
30810 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d  led to read ptrm
30820 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69  ap key=%d", iChi
30830 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ld);.    return;
30840 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72  .  }..  if( ePtr
30850 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c  mapType!=eType |
30860 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21  | iPtrmapParent!
30870 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  =iParent ){.    
30880 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30890 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
308a0 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72   .      "Bad ptr
308b0 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25   map entry key=%
308c0 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25  d expected=(%d,%
308d0 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c  d) got=(%d,%d)",
308e0 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20   .      iChild, 
308f0 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20  eType, iParent, 
30900 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74  ePtrmapType, iPt
30910 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  rmapParent);.  }
30920 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
30930 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
30940 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
30950 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76  list or of an ov
30960 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
30970 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  ..** Verify that
30980 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
30990 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  ages on the list
309a0 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   is N..*/.static
309b0 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28   void checkList(
309c0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
309d0 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65  pCheck,  /* Inte
309e0 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63  grity checking c
309f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
30a00 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20  isFreeList,     
30a10 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
30a20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65  freelist.  False
30a30 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61   for overflow pa
30a40 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ge list */.  int
30a50 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
30a60 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
30a70 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65  r for first page
30a80 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
30a90 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
30aa0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
30ab0 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ted number of pa
30ac0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
30ad0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
30ae0 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ext        /* Co
30af0 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
30b00 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  messages */.){. 
30b10 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78   int i;.  int ex
30b20 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e  pected = N;.  in
30b30 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65  t iFirst = iPage
30b40 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e  ;.  while( N-- >
30b50 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78   0 && pCheck->mx
30b60 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67  Err ){.    DbPag
30b70 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20  e *pOvflPage;.  
30b80 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30b90 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20  *pOvflData;.    
30ba0 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20  if( iPage<1 ){. 
30bb0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
30bc0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30bd0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22  text,.         "
30be0 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d  %d of %d pages m
30bf0 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72  issing from over
30c00 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69  flow list starti
30c10 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20  ng at %d",.     
30c20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74       N+1, expect
30c30 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  ed, iFirst);.   
30c40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30c50 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66      if( checkRef
30c60 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
30c70 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61  zContext) ) brea
30c80 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  k;.    if( sqlit
30c90 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65 63  e3PagerGet(pChec
30ca0 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f  k->pPager, (Pgno
30cb0 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61  )iPage, &pOvflPa
30cc0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ge) ){.      che
30cd0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30ce0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66  ck, zContext, "f
30cf0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67  ailed to get pag
30d00 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
30d10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30d20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20  }.    pOvflData 
30d30 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
30d40 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
30d50 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65  etData(pOvflPage
30d60 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72 65  );.    if( isFre
30d70 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  eList ){.      i
30d80 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  nt n = get4byte(
30d90 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a  &pOvflData[4]);.
30da0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30db0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
30dc0 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
30dd0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
30de0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
30df0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
30e00 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
30e10 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
30e20 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
30e30 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e  ndif.      if( n
30e40 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73  >pCheck->pBt->us
30e50 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a  ableSize/4-8 ){.
30e60 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
30e70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
30e80 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
30e90 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65      "freelist le
30ea0 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67  af count too big
30eb0 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50   on page %d", iP
30ec0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d  age);.        N-
30ed0 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
30ee0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
30ef0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
30f00 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
30f10 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
30f20 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34  &pOvflData[8+i*4
30f30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
30f40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30f50 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  UM.          if(
30f60 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
30f70 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
30f80 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
30f90 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65  map(pCheck, iFre
30fa0 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  ePage, PTRMAP_FR
30fb0 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
30fc0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
30fd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
30fe0 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65     checkRef(pChe
30ff0 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a  ck, iFreePage, z
31000 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
31010 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d    }.        N -=
31020 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
31030 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
31040 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31050 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
31060 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
31070 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
31080 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50  to-vacuum and iP
31090 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  age is not the l
310a0 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ast.      ** pag
310b0 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c  e in this overfl
310c0 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74  ow list, check t
310d0 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hat the pointer-
310e0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
310f0 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
31100 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65  wing page matche
31110 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a  s iPage..      *
31120 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  /.      if( pChe
31130 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
31140 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20  uum && N>0 ){.  
31150 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79        i = get4by
31160 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
31170 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
31180 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54  ap(pCheck, i, PT
31190 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
311a0 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
311b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
311c0 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65  #endif.    iPage
311d0 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
311e0 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  lData);.    sqli
311f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
31200 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  vflPage);.  }.}.
31210 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31220 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
31230 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
31240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
31250 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
31260 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73  .** Do various s
31270 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20  anity checks on 
31280 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66  a single page of
31290 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e   a tree.  Return
312a0 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70  .** the tree dep
312b0 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20  th.  Root pages 
312c0 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e  return 0.  Paren
312d0 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ts of root pages
312e0 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e  .** return 1, an
312f0 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a  d so forth..** .
31300 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20  ** These checks 
31310 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  are done:.**.** 
31320 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75       1.  Make su
31330 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e  re that cells an
31340 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20  d freeblocks do 
31350 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20  not overlap.**  
31360 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62          but comb
31370 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ine to completel
31380 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65  y cover the page
31390 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61  ..**  NO  2.  Ma
313a0 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79  ke sure cell key
313b0 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a  s are in order..
313c0 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65  **  NO  3.  Make
313d0 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
313e0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
313f0 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e  al to zLowerBoun
31400 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d  d..**  NO  4.  M
31410 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
31420 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
31430 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70  or equal to zUpp
31440 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20  erBound..**     
31450 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69   5.  Check the i
31460 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72  ntegrity of over
31470 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20  flow pages..**  
31480 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76      6.  Recursiv
31490 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72  ely call checkTr
314a0 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68  eePage on all ch
314b0 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20  ildren..**      
314c0 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  7.  Verify that 
314d0 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c  the depth of all
314e0 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65   children is the
314f0 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38   same..**      8
31500 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
31510 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61  s page is at lea
31520 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65  st 33% full or e
31530 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  lse it is.**    
31540 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f        the root o
31550 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73  f the tree..*/.s
31560 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54  tatic int checkT
31570 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67  reePage(.  Integ
31580 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
31590 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
315a0 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  the sanity check
315b0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
315c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
315d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
315e0 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20  e page to check 
315f0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
31600 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61  arent,     /* Pa
31610 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63  rent page */.  c
31620 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74  har *zParentCont
31630 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63  ext  /* Parent c
31640 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d  ontext */.){.  M
31650 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
31660 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74   int i, rc, dept
31670 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74  h, d2, pgno, cnt
31680 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c  ;.  int hdr, cel
31690 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43  lStart;.  int nC
316a0 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b  ell;.  u8 *data;
316b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
316c0 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
316d0 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74  ze;.  char zCont
316e0 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72  ext[100];.  char
316f0 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65   *hit;..  sqlite
31700 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31710 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
31720 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a  ntext, "Page %d:
31730 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f   ", iPage);..  /
31740 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
31750 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a   page exists.  *
31760 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b  /.  pBt = pCheck
31770 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53  ->pBt;.  usableS
31780 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
31790 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61  eSize;.  if( iPa
317a0 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
317b0 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66  ;.  if( checkRef
317c0 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
317d0 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20  zParentContext) 
317e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
317f0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  ( (rc = sqlite3B
31800 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
31810 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70   (Pgno)iPage, &p
31820 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Page, 0))!=0 ){.
31830 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31840 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
31850 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61  ext,.       "una
31860 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70  ble to get the p
31870 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d  age. error code=
31880 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
31890 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
318a0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  ( (rc = sqlite3B
318b0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
318c0 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30  ge, pParent))!=0
318d0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
318e0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
318f0 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71               "sq
31910 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
31920 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72  ge() returns err
31930 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29  or code %d", rc)
31940 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
31950 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
31960 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
31970 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20  * Check out all 
31980 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  the cells..  */.
31990 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66    depth = 0;.  f
319a0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
319b0 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b  >nCell && pCheck
319c0 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20  ->mxErr; i++){. 
319d0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
319e0 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65    int sz;.    Ce
319f0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
31a00 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f    /* Check paylo
31a10 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ad overflow page
31a20 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  s.    */.    sql
31a30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
31a40 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
31a50 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
31a60 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20         "On tree 
31a70 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a  page %d cell %d:
31a80 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20   ", iPage, i);. 
31a90 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
31aa0 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20  ell(pPage,i);.  
31ab0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
31ac0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
31ad0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
31ae0 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e  .    sz = info.n
31af0 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70  Data;.    if( !p
31b00 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73  Page->intKey ) s
31b10 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  z += info.nKey;.
31b20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d      assert( sz==
31b30 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
31b40 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f  .    if( sz>info
31b50 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
31b60 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a   int nPage = (sz
31b70 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
31b80 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29   usableSize - 5)
31b90 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  /(usableSize - 4
31ba0 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  );.      Pgno pg
31bb0 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
31bc0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
31bd0 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64  verflow]);.#ifnd
31be0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31bf0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
31c00 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31c10 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
31c20 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
31c30 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  k, pgnoOvfl, PTR
31c40 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69  MAP_OVERFLOW1, i
31c50 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
31c60 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
31c70 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28        checkList(
31c80 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f  pCheck, 0, pgnoO
31c90 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e  vfl, nPage, zCon
31ca0 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  text);.    }..  
31cb0 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74    /* Check sanit
31cc0 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20  y of left child 
31cd0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
31ce0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
31cf0 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20  f ){.      pgno 
31d00 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
31d10 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
31d20 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31d30 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
31d40 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
31d50 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
31d60 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ap(pCheck, pgno,
31d70 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69   PTRMAP_BTREE, i
31d80 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
31d90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
31da0 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b        d2 = check
31db0 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c  TreePage(pCheck,
31dc0 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74  pgno,pPage,zCont
31dd0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
31de0 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68  i>0 && d2!=depth
31df0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31e00 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31e10 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68  k, zContext, "Ch
31e20 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64  ild page depth d
31e30 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20  iffers");.      
31e40 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20  }.      depth = 
31e50 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d2;.    }.  }.  
31e60 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
31e70 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
31e80 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
31e90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
31ea0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
31eb0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31ec0 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
31ed0 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  ), zContext, .  
31ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ef0 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61     "On page %d a
31f00 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22  t right child: "
31f10 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65  , iPage);.#ifnde
31f20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31f30 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
31f40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31f50 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50   ){.      checkP
31f60 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
31f70 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
31f80 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  , iPage, 0);.   
31f90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
31fa0 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
31fb0 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c  ck, pgno, pPage,
31fc0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a   zContext);.  }.
31fd0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72   .  /* Check for
31fe0 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61   complete covera
31ff0 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  ge of the page. 
32000 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61   */.  data = pPa
32010 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
32020 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
32030 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c  set;.  hit = sql
32040 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
32050 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
32060 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20 6d  if( hit ){.    m
32070 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65  emset(hit, 1, ge
32080 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
32090 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  +5]));.    nCell
320a0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
320b0 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63  a[hdr+3]);.    c
320c0 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b  ellStart = hdr +
320d0 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
320e0 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  eaf;.    for(i=0
320f0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
32100 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20  .      int pc = 
32110 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
32120 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a  ellStart+i*2]);.
32130 20 20 20 20 20 20 75 31 36 20 73 69 7a 65 20 3d        u16 size =
32140 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
32150 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a  ge, &data[pc]);.
32160 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
32170 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d     if( (pc+size-
32180 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  1)>=usableSize |
32190 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  | pc<0 ){.      
321a0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
321b0 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
321c0 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
321d0 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
321e0 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65   cell %d on page
321f0 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b   %d",i,iPage,0);
32200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32210 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73        for(j=pc+s
32220 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d  ize-1; j>=pc; j-
32230 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
32240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
32250 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32  or(cnt=0, i=get2
32260 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
32270 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61  ]); i>0 && i<usa
32280 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31  bleSize && cnt<1
32290 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20  0000; .         
322a0 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20    cnt++){.      
322b0 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62  int size = get2b
322c0 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b  yte(&data[i+2]);
322d0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
322e0 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d      if( (i+size-
322f0 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  1)>=usableSize |
32300 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  | i<0 ){.       
32310 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32320 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20  pCheck, 0,  .   
32330 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
32340 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
32350 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65   cell %d on page
32360 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b   %d",i,iPage,0);
32370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32380 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69        for(j=i+si
32390 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29  ze-1; j>=i; j--)
323a0 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20   hit[j]++;.     
323b0 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74   }.      i = get
323c0 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b  2byte(&data[i]);
323d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
323e0 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65  =cnt=0; i<usable
323f0 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Size; i++){.    
32400 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20    if( hit[i]==0 
32410 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  ){.        cnt++
32420 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
32430 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20  ( hit[i]>1 ){.  
32440 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
32450 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a  dMsg(pCheck, 0,.
32460 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69            "Multi
32470 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74  ple uses for byt
32480 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22  e %d of page %d"
32490 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  , i, iPage);.   
324a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
324b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
324c0 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b  ( cnt!=data[hdr+
324d0 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  7] ){.      chec
324e0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
324f0 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
32500 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61   "Fragmented spa
32510 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65  ce is %d byte re
32520 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20  ported as %d on 
32530 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20  page %d",.      
32540 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64      cnt, data[hd
32550 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  r+7], iPage);.  
32560 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
32570 33 5f 66 72 65 65 28 68 69 74 29 3b 0a 0a 20 20  3_free(hit);..  
32580 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
32590 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70  e);.  return dep
325a0 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  th+1;.}.#endif /
325b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
325c0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
325d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
325e0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
325f0 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CHECK./*.** This
32600 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
32610 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f  complete check o
32620 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65  f the given BTre
32630 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d  e file.  aRoot[]
32640 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20   is.** an array 
32650 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  of pages numbers
32660 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20   were each page 
32670 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f  number is the ro
32680 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20  ot page of.** a 
32690 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73  table.  nRoot is
326a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
326b0 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e  ntries in aRoot.
326c0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
326d0 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c  hing checks out,
326e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
326f0 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20  turns NULL.  If 
32700 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20  something is.** 
32710 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20  amiss, an error 
32720 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
32730 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
32740 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
32750 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70  loc().** and a p
32760 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65  ointer to that e
32770 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
32780 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63  returned.  The c
32790 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
327a0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
327b0 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
327c0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
327d0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
327e0 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
327f0 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
32800 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70  heck(.  Btree *p
32810 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72  ,     /* The btr
32820 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  ee to be checked
32830 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
32840 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20  ,   /* An array 
32850 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  of root pages nu
32860 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69  mbers for indivi
32870 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20  dual trees */.  
32880 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a  int nRoot,    /*
32890 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
328a0 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f  es in aRoot[] */
328b0 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20  .  int mxErr,   
328c0 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69   /* Stop reporti
328d0 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20  ng errors after 
328e0 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69  this many */.  i
328f0 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20  nt *pnErr    /* 
32900 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  Write number of 
32910 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74  errors seen to t
32920 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  his variable */.
32930 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
32940 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72  t nRef;.  Integr
32950 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20  ityCk sCheck;.  
32960 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32970 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
32980 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
32990 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
329a0 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c  db;.  nRef = sql
329b0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
329c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
329d0 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
329e0 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
329f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
32a00 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
32a10 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  p);.    return s
32a20 71 6c 69 74 65 33 53 74 72 44 75 70 28 22 55 6e  qlite3StrDup("Un
32a30 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72 65 20  able to acquire 
32a40 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
32a50 68 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  he database");. 
32a60 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20   }.  sCheck.pBt 
32a70 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e  = pBt;.  sCheck.
32a80 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
32a90 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e  ager;.  sCheck.n
32aa0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
32ab0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 73 43 68  gerPagecount(sCh
32ac0 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20 73  eck.pPager);.  s
32ad0 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78  Check.mxErr = mx
32ae0 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45  Err;.  sCheck.nE
32af0 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72  rr = 0;.  *pnErr
32b00 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
32b10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32b20 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
32b30 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
32b40 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20   sCheck.nPage = 
32b50 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d  pBt->nTrunc;.  }
32b60 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43  .#endif.  if( sC
32b70 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b  heck.nPage==0 ){
32b80 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
32b90 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
32ba0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
32bb0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
32bc0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
32bd0 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
32be0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 73 43 68  te3_malloc( (sCh
32bf0 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a  eck.nPage+1)*siz
32c00 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  eof(sCheck.anRef
32c10 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73  [0]) );.  if( !s
32c20 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20  Check.anRef ){. 
32c30 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
32c40 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
32c50 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20   *pnErr = 1;.   
32c60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
32c70 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
32c80 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  n sqlite3MPrintf
32c90 28 70 2d 3e 64 62 2c 20 22 55 6e 61 62 6c 65 20  (p->db, "Unable 
32ca0 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74  to malloc %d byt
32cb0 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73  es", .        (s
32cc0 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
32cd0 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
32ce0 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66  ef[0]));.  }.  f
32cf0 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63  or(i=0; i<=sChec
32d00 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73  k.nPage; i++){ s
32d10 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d  Check.anRef[i] =
32d20 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44   0; }.  i = PEND
32d30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
32d40 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68  t);.  if( i<=sCh
32d50 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20  eck.nPage ){.   
32d60 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32d70 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65   = 1;.  }.  sChe
32d80 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  ck.zErrMsg = 0;.
32d90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
32da0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
32db0 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20   freelist.  */. 
32dc0 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65   checkList(&sChe
32dd0 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28  ck, 1, get4byte(
32de0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
32df0 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20  ata[32]),.      
32e00 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
32e10 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
32e20 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66  ta[36]), "Main f
32e30 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20  reelist: ");..  
32e40 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65  /* Check all the
32e50 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
32e60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74  for(i=0; i<nRoot
32e70 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
32e80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
32e90 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f  aRoot[i]==0 ) co
32ea0 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
32eb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32ec0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
32ed0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
32ee0 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a  & aRoot[i]>1 ){.
32ef0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
32f00 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  p(&sCheck, aRoot
32f10 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  [i], PTRMAP_ROOT
32f20 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  PAGE, 0, 0);.   
32f30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
32f40 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68  eckTreePage(&sCh
32f50 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30  eck, aRoot[i], 0
32f60 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20  , "List of tree 
32f70 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a  roots: ");.  }..
32f80 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
32f90 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
32fa0 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e   file is referen
32fb0 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ced.  */.  for(i
32fc0 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =1; i<=sCheck.nP
32fd0 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78  age && sCheck.mx
32fe0 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  Err; i++){.#ifde
32ff0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
33000 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
33010 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
33020 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ==0 ){.      che
33030 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
33040 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
33050 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
33060 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   i);.    }.#else
33070 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
33080 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
33090 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61   auto-vacuum, ma
330a0 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65  ke sure no table
330b0 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  s contain.    **
330c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70   references to p
330d0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
330e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
330f0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
33100 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  ==0 && .       (
33110 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
33120 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74  t, i)!=i || !pBt
33130 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
33140 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
33150 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
33160 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
33170 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
33180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68     }.    if( sCh
33190 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20  eck.anRef[i]!=0 
331a0 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
331b0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
331c0 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
331d0 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
331e0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
331f0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
33200 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
33210 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
33220 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
33230 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
33240 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
33250 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
33260 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
33270 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
33280 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
33290 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
332a0 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   != sqlite3Pager
332b0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
332c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65  ager) ){.    che
332d0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
332e0 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22  eck, 0, .      "
332f0 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  Outstanding page
33300 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d   count goes from
33310 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67   %d to %d during
33320 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c   this analysis",
33330 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c  .      nRef, sql
33340 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
33350 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20  t(pBt->pPager). 
33360 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
33370 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65  Clean  up and re
33380 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a  port errors..  *
33390 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
333a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c 69  Leave(p);.  sqli
333b0 74 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e  te3_free(sCheck.
333c0 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72  anRef);.  *pnErr
333d0 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a   = sCheck.nErr;.
333e0 20 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b 2e    return sCheck.
333f0 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69  zErrMsg;.}.#endi
33400 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
33410 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
33420 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
33430 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
33440 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72  ame of the under
33450 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
33460 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ile..**.** The p
33470 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69 73  ager filename is
33480 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f   invariant as lo
33490 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ng as the pager 
334a0 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74  is.** open so it
334b0 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65   is safe to acce
334c0 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42  ss without the B
334d0 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a  tShared mutex..*
334e0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
334f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
33500 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  ename(Btree *p){
33510 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
33520 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
33530 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
33540 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d  PagerFilename(p-
33550 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
33560 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33570 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  he pathname of t
33580 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
33590 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  t contains the d
335a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
335b0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64 69  .** The pager di
335c0 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73 20  rectory name is 
335d0 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
335e0 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
335f0 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
33600 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
33610 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
33620 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
33630 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
33640 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e  ite3BtreeGetDirn
33650 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
33660 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
33670 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
33680 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
33690 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42  gerDirname(p->pB
336a0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  t->pPager);.}../
336b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
336c0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
336d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
336e0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20   this database. 
336f0 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61  The return.** va
33700 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74  lue of this rout
33710 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ine is the same 
33720 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
33730 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ether the journa
33740 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  l file.** has be
33750 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f  en created or no
33760 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  t..**.** The pag
33770 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
33780 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74  ame is invariant
33790 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
337a0 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e  pager is.** open
337b0 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   so it is safe t
337c0 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74  o access without
337d0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75   the BtShared mu
337e0 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  tex..*/.const ch
337f0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
33800 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42  GetJournalname(B
33810 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
33820 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
33830 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
33840 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  n sqlite3PagerJo
33850 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74  urnalname(p->pBt
33860 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69  ->pPager);.}..#i
33870 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33880 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43  T_VACUUM./*.** C
33890 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  opy the complete
338a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46   content of pBtF
338b0 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20  rom into pBtTo. 
338c0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   A transaction.*
338d0 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  * must be active
338e0 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e   for both files.
338f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
33900 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79 20  of file pTo may 
33910 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68  be reduced by th
33920 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
33930 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
33940 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61  s wrong, the tra
33950 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20  nsaction on pTo 
33960 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
33970 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
33980 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73  sful, CommitPhas
33990 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63 61  eOne() may be ca
339a0 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f  lled on pTo befo
339b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a  re returning. .*
339c0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  * The caller sho
339d0 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69  uld finish commi
339e0 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  tting the transa
339f0 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20  ction on pTo by 
33a00 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
33a10 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e  e3BtreeCommit().
33a20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
33a30 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72  treeCopyFile(Btr
33a40 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a  ee *pTo, Btree *
33a50 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63  pFrom){.  int rc
33a60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33a70 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20  Pgno i;..  Pgno 
33a80 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f  nFromPage;     /
33a90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
33aa0 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20  s in pFrom */.  
33ab0 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20  Pgno nToPage;   
33ac0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33ad0 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f   pages in pTo */
33ae0 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65  .  Pgno nNewPage
33af0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
33b00 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f   of pages in pTo
33b10 20 61 66 74 65 72 20 74 68 65 20 63 6f 70 79 20   after the copy 
33b20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70  */..  Pgno iSkip
33b30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e  ;         /* Pen
33b40 64 69 6e 67 20 62 79 74 65 20 70 61 67 65 20 69  ding byte page i
33b50 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  n pTo */.  int n
33b60 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20 2f  ToPageSize;    /
33b70 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70  * Page size of p
33b80 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  To in bytes */. 
33b90 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53 69   int nFromPageSi
33ba0 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ze;  /* Page siz
33bb0 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62 79  e of pFrom in by
33bc0 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72  tes */..  BtShar
33bd0 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d  ed *pBtTo = pTo-
33be0 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64  >pBt;.  BtShared
33bf0 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f   *pBtFrom = pFro
33c00 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d  m->pBt;.  pBtTo-
33c10 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20  >db = pTo->db;. 
33c20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70   pBtFrom->db = p
33c30 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f  From->db;..  nTo
33c40 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54 6f  PageSize = pBtTo
33c50 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46  ->pageSize;.  nF
33c60 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70 42  romPageSize = pB
33c70 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b  tFrom->pageSize;
33c80 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54  ..  if( pTo->inT
33c90 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
33ca0 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72  E || pFrom->inTr
33cb0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
33cc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33cd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
33ce0 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43  .  if( pBtTo->pC
33cf0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
33d00 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
33d10 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20  .  }..  nToPage 
33d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
33d30 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70  gecount(pBtTo->p
33d40 50 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f 6d 50  Pager);.  nFromP
33d50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
33d60 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 46  erPagecount(pBtF
33d70 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  rom->pPager);.  
33d80 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f  iSkip = PENDING_
33d90 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29  BYTE_PAGE(pBtTo)
33da0 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ;..  /* Variable
33db0 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74 68 65   nNewPage is the
33dc0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
33dd0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
33de0 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74  re the.  ** cont
33df0 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 75 73  ents of pFrom us
33e00 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
33e10 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f  page-size of pTo
33e20 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61 67  ..  */.  nNewPag
33e30 65 20 3d 20 28 28 69 36 34 29 6e 46 72 6f 6d 50  e = ((i64)nFromP
33e40 61 67 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d  age * (i64)nFrom
33e50 50 61 67 65 53 69 7a 65 20 2b 20 28 69 36 34 29  PageSize + (i64)
33e60 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 31 29  nToPageSize - 1)
33e70 20 2f 20 0a 20 20 20 20 20 20 28 69 36 34 29 6e   / .      (i64)n
33e80 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 66  ToPageSize;..  f
33e90 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
33ea0 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54 6f  TE_OK && (i<=nTo
33eb0 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77 50  Page || i<=nNewP
33ec0 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20  age); i++){..   
33ed0 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65 20   /* Journal the 
33ee0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a 20  original page.. 
33ef0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53 6b     **.    ** iSk
33f00 69 70 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ip is the page n
33f10 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 6f 63  umber of the loc
33f20 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e 44 49  king page (PENDI
33f30 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a 20 20  NG_BYTE_PAGE).  
33f40 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65    ** in database
33f50 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20 74 68   *pTo (before th
33f60 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20 70 61  e copy). This pa
33f70 67 65 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  ge is never writ
33f80 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ten .    ** into
33f90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
33fa0 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53 6b  e. Unless i==iSk
33fb0 69 70 20 6f 72 20 74 68 65 20 70 61 67 65 20 77  ip or the page w
33fc0 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70 72  as not.    ** pr
33fd0 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62 65 66  esent in pTo bef
33fe0 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 70 65  ore the copy ope
33ff0 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c 20  ration, journal 
34000 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54 6f 2e  page i from pTo.
34010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34020 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e  i!=iSkip && i<=n
34030 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  ToPage ){.      
34040 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
34050 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34060 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54  te3PagerGet(pBtT
34070 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  o->pPager, i, &p
34080 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
34090 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
340a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
340b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
340c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
340d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
340e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 62   rc ){.        b
340f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
34100 20 20 20 20 69 66 28 20 69 3e 6e 46 72 6f 6d 50      if( i>nFromP
34110 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  age ){.        /
34120 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d  * Yeah.  It seem
34130 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20  s wierd to call 
34140 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67 68  DontWrite() righ
34150 74 20 61 66 74 65 72 20 57 72 69 74 65 28 29 2e  t after Write().
34160 20 42 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   But.        ** 
34170 74 68 61 74 20 69 73 20 62 65 63 61 75 73 65 20  that is because 
34180 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f  the names of tho
34190 73 65 20 70 72 6f 63 65 64 75 72 65 73 20 64 6f  se procedures do
341a0 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a 20 20   not exactly .  
341b0 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65        ** represe
341c0 6e 74 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e  nt what they do.
341d0 20 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79    Write() really
341e0 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69 73   means "put this
341f0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20   page in the.   
34200 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
34210 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72   journal and mar
34220 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f  k it as dirty so
34230 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
34240 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
34250 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
34260 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e 22  ase file later."
34270 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75 6e    DontWrite() un
34280 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20  does the second 
34290 70 61 72 74 20 6f 66 0a 20 20 20 20 20 20 20 20  part of.        
342a0 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72 65 76  ** that and prev
342b0 65 6e 74 73 20 74 68 65 20 70 61 67 65 20 66 72  ents the page fr
342c0 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  om being written
342d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
342e0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
342f0 20 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f   page is still o
34300 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
34310 6f 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20  ournal, though. 
34320 20 41 6e 64 20 74 68 61 74 20 69 73 20 74 68 65   And that is the
34330 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f   .        ** who
34340 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73  le point of this
34350 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20 70   block: to put p
34360 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  ages on the roll
34370 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  back journal. . 
34380 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34390 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
343a0 6e 74 57 72 69 74 65 28 70 44 62 50 61 67 65 29  ntWrite(pDbPage)
343b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
343c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
343d0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
343e0 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  }..    /* Overwr
343f0 69 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ite the data in 
34400 70 61 67 65 20 69 20 6f 66 20 74 68 65 20 74 61  page i of the ta
34410 72 67 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f  rget database */
34420 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
34430 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b  ITE_OK && i!=iSk
34440 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67  ip && i<=nNewPag
34450 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62 50 61  e ){..      DbPa
34460 67 65 20 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b  ge *pToPage = 0;
34470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
34480 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20  nt64 iOff;..    
34490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
344a0 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50  gerGet(pBtTo->pP
344b0 61 67 65 72 2c 20 69 2c 20 26 70 54 6f 50 61 67  ager, i, &pToPag
344c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
344d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
344e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
344f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
34500 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  oPage);.      }.
34510 0a 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20  .      for(.    
34520 20 20 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e      iOff=(i-1)*n
34530 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20  ToPageSize; .   
34540 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
34550 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f  OK && iOff<i*nTo
34560 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
34570 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d     iOff += nFrom
34580 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 29  PageSize.      )
34590 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  {.        DbPage
345a0 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b   *pFromPage = 0;
345b0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
345c0 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f  rom = (iOff/nFro
345d0 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20  mPageSize)+1;.. 
345e0 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
345f0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
34600 41 47 45 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a  AGE(pBtFrom) ){.
34610 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
34620 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ue;.        }.. 
34630 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34640 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46  te3PagerGet(pBtF
34650 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72  rom->pPager, iFr
34660 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b  om, &pFromPage);
34670 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
34680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34690 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
346a0 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  o = sqlite3Pager
346b0 47 65 74 44 61 74 61 28 70 54 6f 50 61 67 65 29  GetData(pToPage)
346c0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
346d0 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65   *zFrom = sqlite
346e0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46  3PagerGetData(pF
346f0 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
34700 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a      int nCopy;..
34710 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 46            if( nF
34720 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f  romPageSize>=nTo
34730 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  PageSize ){.    
34740 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d          zFrom +=
34750 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53   ((i-1)*nToPageS
34760 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29  ize - ((iFrom-1)
34770 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 29  *nFromPageSize))
34780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  ;.            nC
34790 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a  opy = nToPageSiz
347a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
347b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
347c0 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d  zTo += (((iFrom-
347d0 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  1)*nFromPageSize
347e0 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67  ) - (i-1)*nToPag
347f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
34800 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f      nCopy = nFro
34810 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  mPageSize;.     
34820 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
34830 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46    memcpy(zTo, zF
34840 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09 20 20  rom, nCopy);..  
34850 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34860 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20  f(pFromPage);.  
34870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34880 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 50 61  .      if( pToPa
34890 67 65 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  ge ) sqlite3Page
348a0 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65 29 3b  rUnref(pToPage);
348b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
348c0 20 49 66 20 74 68 69 6e 67 73 20 68 61 76 65 20   If things have 
348d0 77 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c 20 74  worked so far, t
348e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
348f0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
34900 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e  .  ** truncated.
34910 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 70 61 72   The complex par
34920 74 20 69 73 20 74 68 61 74 20 69 74 20 6d 61 79  t is that it may
34930 20 6e 65 65 64 20 74 6f 20 62 65 20 74 72 75 6e   need to be trun
34940 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20  cated to.  ** a 
34950 73 69 7a 65 20 74 68 61 74 20 69 73 20 6e 6f 74  size that is not
34960 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
34970 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67 65 53  iple of nToPageS
34980 69 7a 65 20 2d 20 74 68 65 20 63 75 72 72 65 6e  ize - the curren
34990 74 0a 20 20 2a 2a 20 70 61 67 65 20 73 69 7a 65  t.  ** page size
349a0 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61 67   used by the pag
349b0 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
349c0 74 68 20 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20  th B-Tree pTo.. 
349d0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61   **.  ** For exa
349e0 6d 70 6c 65 2c 20 73 61 79 20 74 68 65 20 70 61  mple, say the pa
349f0 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f 20 69  ge-size of pTo i
34a00 73 20 32 30 34 38 20 62 79 74 65 73 20 61 6e 64  s 2048 bytes and
34a10 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20   the original . 
34a20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
34a30 67 65 73 20 69 73 20 35 20 28 31 30 20 4b 42 20  ges is 5 (10 KB 
34a40 66 69 6c 65 29 2e 20 49 66 20 70 46 72 6f 6d 20  file). If pFrom 
34a50 68 61 73 20 61 20 70 61 67 65 20 73 69 7a 65 20  has a page size 
34a60 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a 20 62 79  of 1024 .  ** by
34a70 74 65 73 20 61 6e 64 20 39 20 70 61 67 65 73 2c  tes and 9 pages,
34a80 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   then the file n
34a90 65 65 64 73 20 74 6f 20 62 65 20 74 72 75 6e 63  eeds to be trunc
34aa0 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a  ated to 9KB..  *
34ab0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
34ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
34ad0 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d   nFromPageSize!=
34ae0 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20  nToPageSize ){. 
34af0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
34b00 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
34b10 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 54  e3PagerFile(pBtT
34b20 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  o->pPager);.    
34b30 20 20 69 36 34 20 69 53 69 7a 65 20 3d 20 28 69    i64 iSize = (i
34b40 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  64)nFromPageSize
34b50 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67   * (i64)nFromPag
34b60 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4e 6f  e;.      i64 iNo
34b70 77 20 3d 20 28 69 36 34 29 28 28 6e 54 6f 50 61  w = (i64)((nToPa
34b80 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f  ge>nNewPage)?nTo
34b90 50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a  Page:nNewPage) *
34ba0 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a   (i64)nToPageSiz
34bb0 65 3b 20 0a 20 20 20 20 20 20 69 36 34 20 69 50  e; .      i64 iP
34bc0 65 6e 64 69 6e 67 20 3d 20 28 28 69 36 34 29 50  ending = ((i64)P
34bd0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34be0 28 70 42 74 54 6f 29 2d 31 29 20 2a 28 69 36 34  (pBtTo)-1) *(i64
34bf0 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20  )nToPageSize;.  
34c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
34c10 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20  Size<=iNow );.  
34c20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74  .      /* Commit
34c30 20 70 68 61 73 65 20 6f 6e 65 20 73 79 6e 63 73   phase one syncs
34c40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34c50 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
34c60 68 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20  h pTo .      ** 
34c70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6f  containing the o
34c80 72 69 67 69 6e 61 6c 20 64 61 74 61 2e 20 49 74  riginal data. It
34c90 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63 20 74   does not sync t
34ca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34cb0 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 65 6c 66  .      ** itself
34cc0 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20 74 68  . After doing th
34cd0 69 73 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  is it is safe to
34ce0 20 75 73 65 20 4f 73 54 72 75 6e 63 61 74 65 28   use OsTruncate(
34cf0 29 20 61 6e 64 20 6f 74 68 65 72 0a 20 20 20 20  ) and other.    
34d00 20 20 2a 2a 20 66 69 6c 65 20 41 50 49 73 20 6f    ** file APIs o
34d10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34d20 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  ile directly..  
34d30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 42 74      */.      pBt
34d40 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62  To->db = pTo->db
34d50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
34d60 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
34d70 68 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70  haseOne(pBtTo->p
34d80 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b  Pager, 0, 0, 1);
34d90 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 7a 65  .      if( iSize
34da0 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c  <iNow && rc==SQL
34db0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
34dd0 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2c 20  Truncate(pFile, 
34de0 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iSize);.      }.
34df0 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20    .      /* The 
34e00 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70 69 65 64  loop that copied
34e10 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61 62   data from datab
34e20 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f  ase pFrom to pTo
34e30 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a   did not.      *
34e40 2a 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * populate the l
34e50 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f 66 20 64  ocking page of d
34e60 61 74 61 62 61 73 65 20 70 54 6f 2e 20 49 66 20  atabase pTo. If 
34e70 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
34e80 0a 20 20 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20  .      ** pFrom 
34e90 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
34ea0 74 68 61 74 20 6f 66 20 70 54 6f 2c 20 74 68 69  that of pTo, thi
34eb0 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64 61 74  s means some dat
34ec0 61 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a will.      ** 
34ed0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 63 6f  not have been co
34ee0 70 69 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  pied. .      **.
34ef0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62 6c        ** This bl
34f00 6f 63 6b 20 63 6f 70 69 65 73 20 74 68 65 20 6d  ock copies the m
34f10 69 73 73 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  issing data from
34f20 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20   database pFrom 
34f30 74 6f 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a  to pTo .      **
34f40 20 75 73 69 6e 67 20 66 69 6c 65 20 41 50 49 73   using file APIs
34f50 2e 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  . This is safe b
34f60 65 63 61 75 73 65 20 61 74 20 74 68 69 73 20 70  ecause at this p
34f70 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74 68 61  oint we know tha
34f80 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f  t.      ** all o
34f90 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
34fa0 61 74 61 20 66 72 6f 6d 20 70 54 6f 20 68 61 73  ata from pTo has
34fb0 20 62 65 65 6e 20 73 79 6e 63 65 64 20 69 6e 74   been synced int
34fc0 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  o the .      ** 
34fd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74  journal file. At
34fe0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
34ff0 6f 75 6c 64 20 62 65 20 73 61 66 65 20 74 6f 20  ould be safe to 
35000 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 74 0a 20  do anything at. 
35010 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74       ** all to t
35020 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35030 20 65 78 63 65 70 74 20 74 72 75 6e 63 61 74 65   except truncate
35040 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
35050 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
35060 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35070 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61 67 65  _OK && nFromPage
35080 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65  Size<nToPageSize
35090 20 26 26 20 69 53 69 7a 65 3e 69 50 65 6e 64 69   && iSize>iPendi
350a0 6e 67 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ng){.        i64
350b0 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66   iOff;.        f
350c0 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 69 4f  or(.          iO
350d0 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20  ff=iPending; .  
350e0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
350f0 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69  TE_OK && iOff<(i
35100 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53  Pending+nToPageS
35110 69 7a 65 29 3b 20 0a 20 20 20 20 20 20 20 20 20  ize); .         
35120 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61   iOff += nFromPa
35130 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 29  geSize.        )
35140 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
35150 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20  ge *pFromPage = 
35160 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  0;.          Pgn
35170 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f  o iFrom = (iOff/
35180 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31  nFromPageSize)+1
35190 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69  ;.  .          i
351a0 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e  f( iFrom==PENDIN
351b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 46  G_BYTE_PAGE(pBtF
351c0 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46  rom) || iFrom>nF
351d0 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20  romPage ){.     
351e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
351f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
35200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35210 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
35220 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20  BtFrom->pPager, 
35230 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67  iFrom, &pFromPag
35240 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
35250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
35270 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c  har *zFrom = sql
35280 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
35290 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 09  (pFromPage);.  .
352a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
352b0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a 46 72  Write(pFile, zFr
352c0 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  om, nFromPageSiz
352d0 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  e, iOff);.      
352e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
352f0 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67  erUnref(pFromPag
35300 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
35310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35320 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79  }.  .      /* Sy
35330 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
35340 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  file */.      if
35350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35360 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
35370 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
35380 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b  (pBtTo->pPager);
35390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
353a0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
353b0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
353c0 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ate(pBtTo->pPage
353d0 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a 20 20  r, nNewPage);.  
353e0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
353f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35400 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69     pBtTo->pageSi
35410 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20 20 20  zeFixed = 0;.   
35420 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
35430 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
35440 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f  treeRollback(pTo
35450 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
35460 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c   rc;  .}.int sql
35470 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c  ite3BtreeCopyFil
35480 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74  e(Btree *pTo, Bt
35490 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ree *pFrom){.  i
354a0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
354b0 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f 29 3b  BtreeEnter(pTo);
354c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
354d0 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20 20 72  nter(pFrom);.  r
354e0 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46 69 6c  c = btreeCopyFil
354f0 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a 20  e(pTo, pFrom);. 
35500 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
35510 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c  ve(pFrom);.  sql
35520 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
35530 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  To);.  return rc
35540 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
35550 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
35560 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  M */../*.** Retu
35570 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
35580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
35590 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
355a0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
355b0 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  rans(Btree *p){.
355c0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
355d0 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
355e0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
355f0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  x) );.  return (
35600 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73  p && (p->inTrans
35610 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b  ==TRANS_WRITE));
35620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
35630 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73   non-zero if a s
35640 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
35650 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
35660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
35670 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65  reeIsInStmt(Btre
35680 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
35690 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
356a0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
356b0 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26  return (p->pBt &
356c0 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74  & p->pBt->inStmt
356d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
356e0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
356f0 20 72 65 61 64 20 28 6f 72 20 77 72 69 74 65 29   read (or write)
35700 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
35710 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
35720 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
35730 65 61 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a  eadTrans(Btree *
35740 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
35750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35760 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
35770 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
35780 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
35790 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f  ANS_NONE));.}../
357a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
357b0 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
357c0 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f  nter to a blob o
357d0 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
357e0 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69  ted with.** a si
357f0 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65  ngle shared-btre
35800 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73  e. The memory is
35810 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20   used by client 
35820 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f 77 6e  code for its own
35830 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f  .** purposes (fo
35840 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74  r example, to st
35850 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c  ore a high-level
35860 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74   schema associat
35870 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
35880 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54  shared-btree). T
35890 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
358a0 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65  anages reference
358b0 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73   counting issues
358c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
358d0 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63  t time this is c
358e0 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65  alled on a share
358f0 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20  d-btree, nBytes 
35900 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
35910 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  ** are allocated
35920 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65  , zeroed, and re
35930 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
35940 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73  ller. For each s
35950 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61  ubsequent .** ca
35960 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61  ll the nBytes pa
35970 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
35980 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ed and a pointer
35990 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f   to the same blo
359a0 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72  b.** of memory r
359b0 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
359c0 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20  Just before the 
359d0 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20  shared-btree is 
359e0 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63  closed, the func
359f0 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  tion passed as t
35a00 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67  he .** xFree arg
35a10 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d  ument when the m
35a20 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
35a30 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76   was made is inv
35a40 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  oked on the .** 
35a50 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65  blob of allocate
35a60 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66  d memory. This f
35a70 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
35a80 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ot call sqlite3_
35a90 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65  free().** on the
35aa0 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72   memory, the btr
35ab0 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68  ee layer does th
35ac0 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  at..*/.void *sql
35ad0 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
35ae0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42  Btree *p, int nB
35af0 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65  ytes, void(*xFre
35b00 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42  e)(void *)){.  B
35b10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
35b20 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
35b30 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
35b40 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65   if( !pBt->pSche
35b50 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ma ){.    pBt->p
35b60 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
35b70 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65  MallocZero(nByte
35b80 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72  s);.    pBt->xFr
35b90 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65  eeSchema = xFree
35ba0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
35bb0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
35bc0 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68  return pBt->pSch
35bd0 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ema;.}../*.** Re
35be0 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f  turn true if ano
35bf0 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68 65  ther user of the
35c00 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74 72   same shared btr
35c10 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  ee as the argume
35c20 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c  nt.** handle hol
35c30 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
35c40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69  lock on the sqli
35c50 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
35c60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
35c70 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64  treeSchemaLocked
35c80 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
35c90 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
35ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35cb0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
35cc0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
35cd0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
35ce0 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65 4c 6f   = (queryTableLo
35cf0 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
35d00 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53  T, READ_LOCK)!=S
35d10 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
35d20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
35d30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
35d40 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
35d50 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
35d60 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ACHE./*.** Obtai
35d70 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  n a lock on the 
35d80 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74  table whose root
35d90 20 70 61 67 65 20 69 73 20 69 54 61 62 2e 20 20   page is iTab.  
35da0 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61  The.** lock is a
35db0 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69   write lock if i
35dc0 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72  sWritelock is tr
35dd0 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  ue or a read loc
35de0 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61  k.** if it is fa
35df0 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lse..*/.int sqli
35e00 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c  te3BtreeLockTabl
35e10 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
35e20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74 65  iTab, u8 isWrite
35e30 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
35e40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
35e50 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69 73  8 lockType = (is
35e60 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f  WriteLock?WRITE_
35e70 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b  LOCK:READ_LOCK);
35e80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
35e90 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
35ea0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
35eb0 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
35ec0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
35ed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
35ee0 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
35ef0 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  iTab, lockType);
35f00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
35f10 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
35f20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
35f30 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
35f40 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
35f50 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
35f60 70 43 73 72 20 6d 75 73 74 20 62 65 20 61 20 63  pCsr must be a c
35f70 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72  ursor opened for
35f80 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a   writing on an .
35f90 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 20  ** INTKEY table 
35fa0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
35fb0 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 74 61  ng at a valid ta
35fc0 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54  ble entry. .** T
35fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64  his function mod
35fe0 69 66 69 65 73 20 74 68 65 20 64 61 74 61 20 73  ifies the data s
35ff0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
36000 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20   that entry..** 
36010 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 63 6f  Only the data co
36020 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62  ntent may only b
36030 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74 20 69  e modified, it i
36040 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a  s not possible.*
36050 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
36060 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
36070 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  ta stored..*/.in
36080 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 75  t sqlite3BtreePu
36090 74 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  tData(BtCursor *
360a0 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCsr, u32 offset
360b0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
360c0 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  *z){.  assert( c
360d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
360e0 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCsr) );.  asser
360f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
36100 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42 74 72  _held(pCsr->pBtr
36110 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
36120 3b 0a 20 20 61 73 73 65 72 74 28 70 43 73 72 2d  ;.  assert(pCsr-
36130 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
36140 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  e);.  if( pCsr->
36150 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
36160 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
36170 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61    if( pCsr->eSta
36180 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
36190 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
361a0 20 70 43 73 72 2d 3e 73 6b 69 70 3b 0a 20 20 20   pCsr->skip;.   
361b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
361c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
361d0 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
361e0 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70 72  /* Check some pr
361f0 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20  econditions: .  
36200 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63 75 72  **   (a) the cur
36210 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72 20  sor is open for 
36220 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20 20  writing,.  **   
36230 28 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (b) there is no 
36240 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
36250 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64   table being mod
36260 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20 20  ified and.  **  
36270 20 28 63 29 20 74 68 65 20 63 75 72 73 6f 72 20   (c) the cursor 
36280 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c 69  points at a vali
36290 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74 4b  d row of an intK
362a0 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  ey table..  */. 
362b0 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46 6c   if( !pCsr->wrFl
362c0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
362d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
362e0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
362f0 21 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65 61 64  !pCsr->pBt->read
36300 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 20 20  Only .          
36310 26 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e 69 6e  && pCsr->pBt->in
36320 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
36330 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
36340 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
36350 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCsr->pBtree, p
36360 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Csr->pgnoRoot, p
36370 43 73 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Csr) ){.    retu
36380 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
36390 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
363a0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
363b0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
363c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 73 72 2d  .  }.  if( pCsr-
363d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
363e0 49 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43 73 72  INVALID || !pCsr
363f0 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
36400 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
36410 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
36420 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
36430 50 61 79 6c 6f 61 64 28 70 43 73 72 2c 20 6f 66  Payload(pCsr, of
36440 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
36450 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c 20 30  gned char *)z, 0
36460 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  , 1);.}../* .** 
36470 53 65 74 20 61 20 66 6c 61 67 20 6f 6e 20 74 68  Set a flag on th
36480 69 73 20 63 75 72 73 6f 72 20 74 6f 20 63 61 63  is cursor to cac
36490 68 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73  he the locations
364a0 20 6f 66 20 70 61 67 65 73 20 66 72 6f 6d 20 74   of pages from t
364b0 68 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  he .** overflow 
364c0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 63 75 72  list for the cur
364d0 72 65 6e 74 20 72 6f 77 2e 20 54 68 69 73 20 69  rent row. This i
364e0 73 20 75 73 65 64 20 62 79 20 63 75 72 73 6f 72  s used by cursor
364f0 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f 72 20  s opened.** for 
36500 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
36510 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20   IO only..**.** 
36520 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
36530 74 73 20 61 20 66 6c 61 67 20 6f 6e 6c 79 2e 20  ts a flag only. 
36540 54 68 65 20 61 63 74 75 61 6c 20 70 61 67 65 20  The actual page 
36550 6c 6f 63 61 74 69 6f 6e 20 63 61 63 68 65 0a 2a  location cache.*
36560 2a 20 28 73 74 6f 72 65 64 20 69 6e 20 42 74 43  * (stored in BtC
36570 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
36580 5d 29 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ]) is allocated 
36590 61 6e 64 20 75 73 65 64 20 62 79 20 66 75 6e 63  and used by func
365a0 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 73 73 50 61  tion.** accessPa
365b0 79 6c 6f 61 64 28 29 20 28 74 68 65 20 77 6f 72  yload() (the wor
365c0 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ker function for
365d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
365e0 61 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74  a() and.** sqlit
365f0 65 33 42 74 72 65 65 50 75 74 44 61 74 61 28 29  e3BtreePutData()
36600 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
36610 65 33 42 74 72 65 65 43 61 63 68 65 4f 76 65 72  e3BtreeCacheOver
36620 66 6c 6f 77 28 42 74 43 75 72 73 6f 72 20 2a 70  flow(BtCursor *p
36630 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
36640 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
36650 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
36660 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
36670 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
36680 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
36690 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43 75  );.  assert(!pCu
366a0 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
366b0 64 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28 21  dle);.  assert(!
366c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
366d0 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  ;.  pCur->isIncr
366e0 62 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0a  blobHandle = 1;.
366f0 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.