/ Hex Artifact Content
Login

Artifact 8c46f0ab69ad9549c75a3a91fed87abdaa743e2f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79  c */..  if( pKey
5690: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56a0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
56b0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
56c0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
56d0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
56e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
56f0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  nt)nKey, pKey,. 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
5730: 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
5740: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5750: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5770: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5790: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57a0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57b0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
57c0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
57d0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
57e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
57f0: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
5800: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
5810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5820: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5830: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5840: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5850: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5860: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5870: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5880: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5890: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
58a0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
58b0: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
58c0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
58d0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
58e0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
58f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5900: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5910: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5920: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5930: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5940: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5950: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5960: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5970: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
59a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
59b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
59c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
59d0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
59e0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
59f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5a00: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5a10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5a20: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5a30: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a40: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5a50: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5a60: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5a70: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5a80: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5a90: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5ac0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5ad0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5ae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5af0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b00: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5b20: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5b40: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5b50: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5b60: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5b80: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5ba0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5bb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5bc0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5bd0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5be0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5bf0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5c00: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5c10: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5c20: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5c30: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5c40: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5c50: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5c60: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5c70: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5c90: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5ca0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5cb0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5cc0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5cd0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5ce0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5cf0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5d00: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5d10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5d20: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5d40: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5d50: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5d60: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5d70: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5d80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5d90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5db0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5dc0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5dd0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5de0: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5df0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5e10: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5e30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5e40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5e50: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5e60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5e70: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5e80: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5e90: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ea0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
5eb0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
5ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
5ed0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
5ee0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
5ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
5f00: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
5f10: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
5f20: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
5f30: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
5f40: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
5f50: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
5f60: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
5f70: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
5f80: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
5f90: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
5fa0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5fb0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5fd0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5fe0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5ff0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6010: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6030: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6040: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
6050: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6060: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6070: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6080: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6090: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
60a0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
60b0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
60c0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
60d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
60e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
60f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6100: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6110: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6120: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6130: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6140: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
6150: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6160: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6170: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6180: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6190: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
61a0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
61b0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
61c0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
61d0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
61e0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
61f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6200: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6210: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6220: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6230: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6240: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
6250: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6260: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6270: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6280: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6290: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
62a0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
62b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
62c0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
62d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
62e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
62f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6300: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6310: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6320: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6340: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6360: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6370: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6390: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
63a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
63b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
63c0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
63d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63e0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63f0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6400: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6410: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6420: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6430: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6450: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6480: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6490: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
64a0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
64b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
64c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
64d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
64e0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
64f0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6500: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6510: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6520: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6530: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6550: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6560: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6570: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6580: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6590: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
65a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
65b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
65c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
65d0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
65e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
65f0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6600: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6610: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6620: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6630: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6640: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
6650: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6660: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6670: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6680: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
6690: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
66a0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
66b0: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
66c0: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
66d0: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
66e0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
66f0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6700: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6710: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6720: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6730: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6740: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
6750: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6760: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6770: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6780: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6790: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
67a0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
67b0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
67c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
67d0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
67e0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
67f0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6800: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6810: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6820: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6830: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6840: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6850: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6860: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6870: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6880: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
6890: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
68a0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
68b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
68c0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
68d0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
68e0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
68f0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6900: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6910: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6920: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6930: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6940: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6950: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6960: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6970: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6980: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6990: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
69a0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
69b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
69c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
69d0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
69e0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
69f0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6a00: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6a20: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6a30: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6a40: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6a50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6a60: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6a70: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6a80: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6a90: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6aa0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6ab0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6ac0: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6ad0: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6ae0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6af0: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6b00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6b10: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6b20: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6b30: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6b40: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6b50: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6b60: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6b70: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6b80: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6b90: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6ba0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6bb0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6bc0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6bd0: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6be0: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6bf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6c00: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6c10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6c20: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6c30: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6c40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6c50: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6c60: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6c70: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6c80: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6c90: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6ca0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6cb0: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6cc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6cd0: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6ce0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6cf0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6d00: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6d10: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6d20: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6d30: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6d40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6d50: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
6d60: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
6d70: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
6d80: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
6d90: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
6da0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6db0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
6dc0: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
6dd0: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
6de0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
6df0: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44  et2byte(&(P)->aD
6e00: 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66  ata[(P)->cellOff
6e10: 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 23 64  set+2*(I)]))).#d
6e20: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 76 32  efine findCellv2
6e30: 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d 26  (D,M,O,I) (D+(M&
6e40: 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b 32 2a  get2byte(D+(O+2*
6e50: 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I))))).../*.** 
6e60: 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70  This a more comp
6e70: 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  lex version of f
6e80: 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77  indCell() that w
6e90: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65  orks for.** page
6ea0: 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69  s that do contai
6eb0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
6ec0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
6ed0: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
6ee0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
6ef0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69   int iCell){.  i
6f00: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
6f10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6f20: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
6f30: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
6f40: 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  =pPage->nOverflo
6f50: 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  w-1; i>=0; i--){
6f60: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
6f70: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
6f80: 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76   *pOvfl;.    pOv
6f90: 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76  fl = &pPage->aOv
6fa0: 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70  fl[i];.    k = p
6fb0: 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69  Ovfl->idx;.    i
6fc0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
6fd0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
6fe0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
6ff0: 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c  urn pOvfl->pCell
7000: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7010: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
7020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
7030: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7040: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
7050: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
7060: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
7070: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
7080: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
7090: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
70a0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
70b0: 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50  unction.  btreeP
70c0: 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73  arseCell() takes
70d0: 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65   a .** cell inde
70e0: 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  x as the second 
70f0: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72  argument and btr
7100: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
7110: 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69   .** takes a poi
7120: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79  nter to the body
7130: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
7140: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
7150: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  ent..**.** Withi
7160: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
7170: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63   parseCell() mac
7180: 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ro can be called
7190: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
71a0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
71b0: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
71c0: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
71d0: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
71e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
71f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7200: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
7210: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
7220: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
7230: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
7240: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
7250: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7260: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
7270: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
7280: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7290: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
72a0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
72b0: 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u16 n;          
72c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
72d0: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
72e0: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
72f0: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
7300: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
7310: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
7320: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
7330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
7340: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7350: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
7360: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
7370: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
7380: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7390: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
73a0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
73b0: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
73c0: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
73d0: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
73e0: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
73f0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
7400: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
7410: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e  sData ){.      n
7420: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7430: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
7440: 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oad);.    }else{
7450: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
7460: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  = 0;.    }.    n
7470: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
7480: 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26  Cell[n], (u64*)&
7490: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
74a0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
74b0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c   nPayload;.  }el
74c0: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
74d0: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20  Data = 0;.    n 
74e0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
74f0: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
7500: 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ad);.    pInfo->
7510: 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  nKey = nPayload;
7520: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  .  }.  pInfo->nP
7530: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
7540: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61  d;.  pInfo->nHea
7550: 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63  der = n;.  testc
7560: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
7570: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7580: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
7590: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
75a0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
75b0: 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f  f( likely(nPaylo
75c0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
75d0: 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
75e0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
75f0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
7600: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
7610: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
7620: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
7630: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
7640: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
7650: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
7660: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
7670: 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61 64 29  u16)(n+nPayload)
7680: 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  )<4 ) pInfo->nSi
7690: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
76a0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
76b0: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70  )nPayload;.    p
76c0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
76d0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
76e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
76f0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
7700: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
7710: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
7720: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
7730: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
7740: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
7750: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
7760: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
7770: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
7780: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
7790: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
77a0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
77b0: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
77c0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
77d0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
77e0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
77f0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
7800: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
7810: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
7820: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
7830: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
7840: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
7850: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
7860: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
7870: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
7880: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
7890: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
78a0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
78b0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
78c0: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
78d0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
78e0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
78f0: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
7900: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
7910: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
7920: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7930: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
7940: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
7950: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
7960: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
7970: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
7980: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
7990: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
79a0: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
79b0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
79c0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
79d0: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
79e0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
79f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7a00: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7a10: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
7a20: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  =maxLocal );.   
7a30: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
7a40: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
7a50: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
7a60: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
7a70: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
7a80: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
7a90: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
7aa0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
7ab0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
7ac0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  cal;.    }.    p
7ad0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7ae0: 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e  = (u16)(pInfo->n
7af0: 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20  Local + n);.    
7b00: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
7b10: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7b20: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
7b30: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
7b40: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
7b50: 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65  ) \.  btreeParse
7b60: 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c  CellPtr((pPage),
7b70: 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65   findCell((pPage
7b80: 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49  ), (iCell)), (pI
7b90: 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69  nfo)).static voi
7ba0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
7bb0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
7bc0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
7bd0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
7be0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
7bf0: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
7c00: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
7c10: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
7c20: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
7c30: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
7c40: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
7c50: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
7c60: 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c  */.){.  parseCel
7c70: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
7c80: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
7c90: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
7ca0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
7cb0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
7cc0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
7cd0: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
7ce0: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
7cf0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
7d00: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
7d10: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
7d20: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
7d30: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
7d40: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
7d50: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
7d60: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
7d70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
7d80: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
7d90: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
7da0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
7db0: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
7dc0: 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65  r = &pCell[pPage
7dd0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
7de0: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23  .  u32 nSize;..#
7df0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
7e00: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
7e10: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
7e20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7e30: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
7e40: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
7e50: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
7e60: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
7e70: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
7e80: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
7e90: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
7ea0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
7eb0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
7ec0: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
7ed0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
7ee0: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
7ef0: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
7f00: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
7f10: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
7f20: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65  ebuginfo;.  btre
7f30: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
7f40: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
7f50: 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  uginfo);.#endif.
7f60: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
7f70: 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a  tKey ){.    u8 *
7f80: 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50  pEnd;.    if( pP
7f90: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
7fa0: 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67        pIter += g
7fb0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
7fc0: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  , nSize);.    }e
7fd0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  lse{.      nSize
7fe0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
7ff0: 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f   /* pIter now po
8000: 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62  ints at the 64-b
8010: 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76  it integer key v
8020: 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65  alue, a variable
8030: 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20   length .    ** 
8040: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c  integer. The fol
8050: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76  lowing block mov
8060: 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  es pIter to poin
8070: 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  t at the first b
8080: 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  yte.    ** past 
8090: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b  the end of the k
80a0: 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  ey value. */.   
80b0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
80c0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
80d0: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
80e0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
80f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
8100: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8110: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8120: 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28    }..  testcase(
8130: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
8140: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
8150: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8160: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8170: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  );.  if( nSize>p
8180: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8190: 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  {.    int minLoc
81a0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
81b0: 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20  ocal;.    nSize 
81c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53  = minLocal + (nS
81d0: 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20  ize - minLocal) 
81e0: 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
81f0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
8200: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8210: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8220: 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
8230: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
8240: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
8250: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e  ;.    if( nSize>
8260: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8270: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
8280: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
8290: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b  .    nSize += 4;
82a0: 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20  .  }.  nSize += 
82b0: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
82c0: 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ell);..  /* The 
82d0: 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  minimum size of 
82e0: 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79  any cell is 4 by
82f0: 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53  tes. */.  if( nS
8300: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69  ize<4 ){.    nSi
8310: 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61  ze = 4;.  }..  a
8320: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
8330: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  buginfo.nSize );
8340: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
8350: 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Size;.}..#ifdef 
8360: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
8370: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
8380: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
8390: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
83a0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
83b0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
83c0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
83d0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
83e0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
83f0: 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53  {.  return cellS
8400: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66 69  izePtr(pPage, fi
8410: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
8420: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
8430: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8440: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
8450: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
8460: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
8470: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
8480: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
8490: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
84a0: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
84b0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
84c0: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
84d0: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
84e0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
84f0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
8500: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
8510: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
8520: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
8530: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
8540: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
8550: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
8560: 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65 50  l!=0 );.  btreeP
8570: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
8580: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
8590: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
85a0: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
85b0: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
85c0: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
85d0: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 66  oad );.  if( inf
85e0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
85f0: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
8600: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
8610: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
8620: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
8630: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
8640: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
8650: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
8660: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
8670: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
8680: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
8690: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
86a0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
86b0: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
86c0: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
86d0: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
86e0: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
86f0: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
8700: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
8710: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
8720: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
8730: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
8740: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8750: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
8760: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
8770: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
8780: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
87b0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87d0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
87e0: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
87f0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
8800: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8810: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
8820: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
8830: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8840: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8850: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
8860: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
8870: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8880: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
8890: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
88a0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
88c0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
88d0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
88e0: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
8910: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8920: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
8930: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8940: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8950: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
8960: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
8970: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
8980: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
8990: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
89a0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
89b0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
89c0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
89d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
89e0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
89f0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
8a00: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
8a10: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
8a20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
8a30: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
8a40: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
8a50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8a60: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
8a70: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
8a80: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8a90: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
8aa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8ab0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8ac0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
8ad0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
8ae0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
8af0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
8b00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8b10: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8b20: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8b30: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
8b40: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
8b50: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
8b60: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
8b70: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
8b80: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8b90: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
8ba0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
8bb0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
8bc0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
8bd0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
8be0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8bf0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
8c00: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
8c10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
8c20: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
8c30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
8c40: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
8c50: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
8c60: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
8c70: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
8c80: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
8c90: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
8ca0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
8cb0: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
8cc0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
8cd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
8ce0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
8cf0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
8d00: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
8d10: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
8d20: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
8d30: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
8d40: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
8d50: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
8d60: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
8d70: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8d80: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
8d90: 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66  Last );.#if !def
8da0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8db0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
8dc0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54  _CHECK).    /* T
8dd0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
8de0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
8df0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
8e00: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
8e10: 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45    ** if SQLITE_E
8e20: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8e30: 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66  ELL_CHECK is def
8e40: 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ined .    */.   
8e50: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
8e60: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
8e70: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
8e80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8e90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
8ea0: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
8eb0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
8ec0: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
8ed0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
8ee0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
8ef0: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
8f00: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
8f10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8f20: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
8f30: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
8f40: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
8f50: 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  lFirst ){.      
8f60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8f70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
8f80: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
8f90: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
8fa0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
8fb0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
8fc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8fd0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8fe0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8ff0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
9000: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
9010: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9020: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
9030: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
9040: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
9050: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
9060: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9070: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
9080: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
9090: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
90a0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
90b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
90c0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
90d0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
90e0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
90f0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
9100: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
9110: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
9120: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
9130: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
9140: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
9150: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
9160: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9170: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9180: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9190: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
91a0: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
91b0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
91c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
91d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
91e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
91f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
9200: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
9210: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
9220: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
9230: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
9240: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
9250: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
9260: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
9270: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
9280: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
9290: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
92a0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
92b0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
92c0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
92d0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
92e0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
92f0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
9300: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
9310: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
9320: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
9330: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
9340: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
9350: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
9360: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
9370: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
9380: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
9390: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
93a0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
93b0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
93c0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
93d0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
93e0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
93f0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
9400: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
9410: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
9420: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
9430: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
9440: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
9450: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
9460: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
9470: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
9480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
9490: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
94a0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
94b0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
94c0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
94d0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
94e0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
94f0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9500: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
9510: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
9520: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9530: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
9540: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
9550: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Data */.  int nF
9560: 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  rag;            
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9580: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 67  * Number of frag
9590: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20  mented bytes on 
95a0: 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74  pPage */.  int t
95b0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95d0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
95e0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
95f0: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  ea */.  int gap;
9600: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9610: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
9620: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
9630: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
9640: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ent */.  int rc;
9650: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
9660: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
9670: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
9680: 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73  ize; /* Usable s
9690: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ize of the page 
96a0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
96b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
96c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
96d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
96e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
96f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
9700: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9710: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9720: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9730: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
9740: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
9750: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
9760: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
9770: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
9780: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
9790: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75 73  rflow==0 );.  us
97a0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
97b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
97c0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  e;.  assert( nBy
97d0: 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65 2d  te < usableSize-
97e0: 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20  8 );..  nFrag = 
97f0: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 61  data[hdr+7];.  a
9800: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
9810: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
9820: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
9830: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
9840: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
9850: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
9860: 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32  ll;.  top = get2
9870: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
9880: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28  a[hdr+5]);.  if(
9890: 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75 72   gap>top ) retur
98a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
98b0: 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61 73  _BKPT;.  testcas
98c0: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
98d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
98e0: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
98f0: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
9900: 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  );..  if( nFrag>
9910: 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  =60 ){.    /* Al
9920: 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20  ways defragment 
9930: 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65  highly fragmente
9940: 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  d pages */.    r
9950: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9960: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9970: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9980: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
9990: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
99a0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 65  ta[hdr+5]);.  }e
99b0: 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c 3d 74  lse if( gap+2<=t
99c0: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61  op ){.    /* Sea
99d0: 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  rch the freelist
99e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
99f0: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
9a00: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 0a  ugh to satisfy .
9a10: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
9a20: 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69  st. The allocati
9a30: 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d 20  on is made from 
9a40: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 73  the first free s
9a50: 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  lot in .    ** t
9a60: 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
9a70: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
9a80: 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20  accomadate it.. 
9a90: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63     */.    int pc
9aa0: 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72 28  , addr;.    for(
9ab0: 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20  addr=hdr+1; (pc 
9ac0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9ad0: 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64 72  [addr]))>0; addr
9ae0: 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =pc){.      int 
9af0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
9b00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
9b10: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
9b20: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
9b30: 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64 64  Size-4 || pc<add
9b40: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 72  r+4 ){.        r
9b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9b60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
9b70: 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20   }.      size = 
9b80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9b90: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
9ba0: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
9bb0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
9bc0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
9bd0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9be0: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  x==4 );.        
9bf0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
9c00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
9c10: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
9c20: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
9c30: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
9c40: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
9c50: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
9c60: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
9c70: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
9c80: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
9c90: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
9ca0: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
9cb0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
9cc0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
9cd0: 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78  = (u8)(nFrag + x
9ce0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9cf0: 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75   if( size+pc > u
9d00: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
9d10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9d20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9d30: 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
9d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9d50: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
9d60: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
9d70: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
9d80: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
9d90: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
9da0: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
9db0: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
9dc0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
9dd0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
9de0: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
9df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
9e00: 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20  pIdx = pc + x;. 
9e10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9e20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
9e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9e40: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
9e50: 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f  ure there is eno
9e60: 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65  ugh space in the
9e70: 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a   gap to satisfy.
9e80: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74    ** the allocat
9e90: 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65  ion.  If not, de
9ea0: 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  fragment..  */. 
9eb0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9ec0: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
9ed0: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
9ee0: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  >top ){.    rc =
9ef0: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
9f00: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
9f10: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9f20: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
9f30: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
9f40: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
9f50: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
9f60: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
9f70: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
9f80: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
9f90: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
9fa0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
9fb0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
9fc0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
9fd0: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
9fe0: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
9ff0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
a000: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
a010: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
a020: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
a030: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
a040: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
a050: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
a060: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
a070: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
a080: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
a090: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
a0a0: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
a0b0: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
a0c0: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
a0d0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
a0e0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
a0f0: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
a100: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
a110: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a120: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
a130: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
a140: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a150: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
a160: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
a170: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
a180: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
a190: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
a1a0: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
a1b0: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
a1c0: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
a1d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
a1e0: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
a1f0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
a200: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
a210: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
a220: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
a230: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
a240: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
a250: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
a260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a270: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
a280: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
a290: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
a2a0: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
a2b0: 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69  in, hdr;.  int i
a2c0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2e0: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
a2f0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
a300: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
a310: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
a320: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
a330: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a340: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a350: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a360: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a370: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a380: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
a390: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
a3a0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a3b0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a3c0: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 20   (start + size) 
a3d0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
a3e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
a3f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a400: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a410: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a420: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
a430: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
a440: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
a450: 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66 28 20   is 4 */..  if( 
a460: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 73 65 63 75  pPage->pBt->secu
a470: 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
a480: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
a490: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
a4a0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
a4b0: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
a4c0: 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e  te.    ** option
a4d0: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
a4e0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
a4f0: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
a500: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
a510: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
a520: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
a530: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
a540: 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  s.  Note that.  
a550: 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  ** even though t
a560: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
a570: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
a580: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a590: 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74  ,.  ** btreeInit
a5a0: 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20 64  Page() did not d
a5b0: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69 6e  etect overlappin
a5c0: 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20  g cells or.  ** 
a5d0: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
a5e0: 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c 73  overlapped cells
a5f0: 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  .   Nor does it 
a600: 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65 0a  detect when the.
a610: 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e    ** cell conten
a620: 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20 74  t area exceeds t
a630: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
a640: 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49 66  page header.  If
a650: 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74 75   these.  ** situ
a660: 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74 68  ations arise, th
a670: 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  en subsequent in
a680: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20  sert operations 
a690: 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20 20  might corrupt.  
a6a0: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a6b0: 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64 20    So we do need 
a6c0: 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f 72  to check for cor
a6d0: 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73 63  ruption while sc
a6e0: 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anning.  ** the 
a6f0: 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
a700: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
a710: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
a720: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61  = hdr + 1;.  iLa
a730: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
a740: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
a750: 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74  .  assert( start
a760: 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68 69  <=iLast );.  whi
a770: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
a780: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a790: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
a7a0: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  egin>0 ){.    if
a7b0: 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34 20  ( pbegin<addr+4 
a7c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a7d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a7e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
a7f0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
a800: 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e 69  }.  if( pbegin>i
a810: 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Last ){.    retu
a820: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a830: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
a840: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
a850: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
a860: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a870: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
a880: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a890: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
a8a0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
a8b0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
a8c0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
a8d0: 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46  Free = pPage->nF
a8e0: 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65 3b  ree + (u16)size;
a8f0: 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20  ..  /* Coalesce 
a900: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c  adjacent free bl
a910: 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d  ocks */.  addr =
a920: 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c   hdr + 1;.  whil
a930: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
a940: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a950: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  ]))>0 ){.    int
a960: 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78   pnext, psize, x
a970: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a980: 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20  egin>addr );.   
a990: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 20   assert( pbegin 
a9a0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
a9b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a9c0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a9d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a9e0: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a9f0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
aa00: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
aa10: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
aa20: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
aa30: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
aa40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
aa50: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
aa60: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
aa70: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
aa80: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
aa90: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
aaa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aab0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
aac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
aad0: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
aae0: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
aaf0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab00: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
ab10: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
ab20: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
ab30: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
ab40: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
ab50: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
ab60: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ab70: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
ab80: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
ab90: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
aba0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
abb0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
abc0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
abd0: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
abe0: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
abf0: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
ac00: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
ac10: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
ac20: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
ac30: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
ac40: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
ac50: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
ac60: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
ac70: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
ac80: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
ac90: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
aca0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
acb0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
acc0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
acd0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ace0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
acf0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
ad00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
ad10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ad20: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
ad30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ad40: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ad50: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
ad60: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ad70: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ad80: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ad90: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
ada0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
adb0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
adc0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
add0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ade0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
adf0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ae00: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
ae10: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
ae20: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
ae30: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
ae40: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
ae50: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
ae60: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ae70: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ae80: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ae90: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
aea0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
aeb0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
aec0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
aed0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
aee0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
aef0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
af00: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
af10: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
af20: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
af30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
af40: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
af50: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
af60: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
af70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
af80: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
af90: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
afa0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
afb0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
afc0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
afd0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
afe0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
aff0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
b000: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
b010: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
b020: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b030: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
b040: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
b050: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
b060: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b070: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
b080: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
b090: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b0a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b0b0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
b0c0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b0d0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
b0e0: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
b0f0: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b100: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b110: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b120: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b130: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b140: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b150: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b160: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b170: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b180: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
b190: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b1a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
b1b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b1c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b1d0: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b1e0: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b1f0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b200: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b210: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b220: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b230: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b240: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b250: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b260: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b270: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b280: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b290: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b2a0: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b2b0: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b2c0: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b2d0: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b2e0: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b2f0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b300: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b310: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b330: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b340: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b350: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b360: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b370: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b380: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b390: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b3a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b3b0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b3c0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b3d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b3e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b3f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b400: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b410: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b420: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b430: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b440: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b450: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b460: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b470: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b490: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b4a0: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b4b0: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b4c0: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b4d0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b4e0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b4f0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b500: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b510: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b520: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b530: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b540: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b550: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b560: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
b570: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b580: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b590: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b5a0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b5b0: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b5c0: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b5d0: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b5e0: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b5f0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
b600: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b610: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b620: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b630: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
b640: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b650: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b660: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b670: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b680: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b690: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b6a0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b6b0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b6c0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b6d0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b6e0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b6f0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b700: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b710: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b720: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b730: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b740: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b750: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b760: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b770: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b780: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b790: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b7a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b7b0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b7c0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
b7d0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b7e0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
b7f0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
b800: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b810: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
b820: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
b830: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
b840: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
b850: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
b860: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
b870: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
b880: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b890: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b8a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b8b0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b8c0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b8d0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b8e0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b8f0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b900: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b910: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b920: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b930: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b950: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b960: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b970: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b980: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b990: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b9a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b9b0: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b9c0: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b9d0: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b9e0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b9f0: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
ba00: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
ba10: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
ba20: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
ba30: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
ba40: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
ba50: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
ba60: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
ba70: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
ba80: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
ba90: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
baa0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
bab0: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
bac0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
bad0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
bae0: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
baf0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
bb00: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
bb10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
bb20: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
bb30: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
bb40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
bb50: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
bb60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
bb70: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
bb80: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
bb90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
bba0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
bbb0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
bbc0: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
bbd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
bbe0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
bbf0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bc00: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
bc10: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
bc20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bc30: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bc40: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
bc50: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bc60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bc70: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bc80: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bc90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bca0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bcb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
bcc0: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
bcd0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
bce0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
bcf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bd00: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
bd10: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bd20: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
bd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bd40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bd50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bd60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bd70: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bd80: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
bd90: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
bda0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bdb0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
bdc0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
bdd0: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
bde0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bdf0: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
be00: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
be10: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
be20: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
be30: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
be40: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
be50: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
be60: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
be70: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
be80: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
be90: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
bea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
beb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
bed0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
bee0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bef0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
bf00: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bf10: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
bf20: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bf30: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bf40: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bf50: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bf60: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bf70: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bf80: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bf90: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bfa0: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bfb0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bfc0: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bfd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bfe0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
c000: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
c010: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
c020: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
c030: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
c040: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
c050: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c060: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c070: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
c080: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c090: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
c0a0: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c0b0: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
c0c0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c0d0: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
c0e0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
c0f0: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c100: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c110: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c120: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c130: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c140: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c150: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c160: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c170: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c180: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c190: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c1a0: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c1b0: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c1c0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c1d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c1e0: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c1f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c200: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c210: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c220: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c230: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c240: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c250: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c260: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c270: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c280: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c290: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c2a0: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c2b0: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c2c0: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c2d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c2e0: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c2f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c300: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c310: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c320: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c330: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c340: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c350: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c360: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c370: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c380: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c390: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c3a0: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c3b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c3c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c3d0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c3e0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c3f0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c400: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c410: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c420: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c430: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c440: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c450: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c470: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c480: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c490: 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
c4a0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65  Delete ){.    me
c4b0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c4c0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c4d0: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c4e0: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c4f0: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c500: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c510: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c520: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c530: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c540: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c550: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c560: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c570: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c580: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c590: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c5a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c5b0: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c5c0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c5d0: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c5e0: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c5f0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
c600: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
c610: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c620: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
c630: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c640: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c650: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c660: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c670: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c680: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
c690: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c6a0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c6b0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c6c0: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c6d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c6e0: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c6f0: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c700: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c710: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c720: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c730: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c740: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c750: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c760: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c770: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c780: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c790: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c7a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c7b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c7c0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c7d0: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c7e0: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c7f0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c800: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c810: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c820: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c830: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c840: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c850: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c860: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c870: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c880: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c890: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c8a0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c8b0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c8c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c8d0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c8e0: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c8f0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c900: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c910: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c920: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c930: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c940: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c950: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c960: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c970: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c980: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c990: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c9a0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c9b0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c9c0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c9d0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c9e0: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c9f0: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
ca00: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
ca10: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
ca20: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
ca30: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
ca40: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
ca50: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
ca60: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
ca70: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
ca80: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
ca90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
caa0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
cab0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
cac0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
cad0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
cae0: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
caf0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
cb00: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
cb10: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
cb20: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
cb30: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
cb40: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
cb50: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
cb60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cb70: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
cb80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cb90: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
cba0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
cbb0: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
cbc0: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
cbd0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cbe0: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
cbf0: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
cc00: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cc10: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
cc20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cc30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
cc40: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cc50: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
cc60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
cc70: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
cc80: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
cc90: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
cca0: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
ccb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
ccc0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
ccd0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cce0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
ccf0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cd00: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
cd10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
cd20: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
cd30: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
cd40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cd50: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
cd60: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
cd70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
cd80: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
cd90: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
cda0: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
cdb0: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
cdc0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
cdd0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
cde0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cdf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
ce00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
ce10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
ce20: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
ce30: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
ce40: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
ce50: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
ce60: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
ce70: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
ce80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
ce90: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
cea0: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
ceb0: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
cec0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
ced0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
cee0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
cef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
cf00: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
cf10: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
cf20: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74    return (int)bt
cf30: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
cf40: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
cf50: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
cf60: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
cf70: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
cf80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
cf90: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
cfa0: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
cfb0: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
cfc0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
cfd0: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
cfe0: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
cff0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
d000: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
d010: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
d020: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
d030: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
d040: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
d050: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
d060: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
d070: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
d080: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
d090: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
d0a0: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
d0b0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d0c0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d0d0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
d0e0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
d0f0: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
d100: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d110: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d120: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d130: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d140: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d150: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d160: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d170: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d180: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d190: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d1a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d1b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d1c0: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d1d0: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d1e0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
d1f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d200: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d210: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d220: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d230: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d240: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d250: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d260: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d270: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d280: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d290: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d2a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d2b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d2c0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d2d0: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d2e0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d2f0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d300: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d310: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d330: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d340: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d350: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d360: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d370: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d380: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d390: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d3a0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d3b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d3c0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d3d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d3e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d3f0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d400: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d410: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d420: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d430: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d440: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d450: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d460: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d480: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d490: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d4a0: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d4b0: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d4c0: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d4d0: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d4e0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d4f0: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d500: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d510: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d520: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d530: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d540: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d550: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d560: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d570: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d580: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d590: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d5a0: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d5b0: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d5c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d5d0: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d5e0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d5f0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d600: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d610: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d620: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d630: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d640: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d650: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d660: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d670: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d680: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d690: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d6a0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d6b0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d6c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d6d0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d6e0: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d6f0: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d700: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d710: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d720: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d730: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d740: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d750: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d760: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d770: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d780: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d790: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d7a0: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d7b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d7c0: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d7d0: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d7e0: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d7f0: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d800: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d810: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d820: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d830: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d840: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d850: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d860: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d870: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d880: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d890: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d8a0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d8b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d8c0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d8d0: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d8e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d8f0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d900: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d910: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d920: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d930: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d940: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d950: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d960: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d970: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d980: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d990: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d9a0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d9c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d9d0: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d9e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d9f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
da00: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
da10: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
da20: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
da30: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
da40: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
da50: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
da60: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
da70: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
da80: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
da90: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
daa0: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
dab0: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
dac0: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
dad0: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
dae0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
daf0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
db00: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
db10: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
db20: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
db30: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
db40: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
db50: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
db60: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
db70: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
db80: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
db90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
dba0: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
dbb0: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
dbc0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
dbd0: 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ts.** BTREE_OMIT
dbe0: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
dbf0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
dc00: 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e 4f  K.  The BTREE_NO
dc10: 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74  _READLOCK.** bit
dc20: 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66 20   is also set if 
dc30: 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61  the SQLITE_NoRea
dc40: 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20 73  dlock flags is s
dc50: 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e  et in db->flags.
dc60: 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73 20  .** These flags 
dc70: 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
dc80: 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 50  gh into sqlite3P
dc90: 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20 6d  agerOpen() and m
dca0: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61  ust.** be the sa
dcb0: 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41 47  me values as PAG
dcc0: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
dcd0: 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
dce0: 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  DLOCK..**.** If 
dcf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
dd00: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
dd10: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
dd20: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
dd30: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
dd40: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
dd50: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
dd60: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
dd70: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
dd80: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
dd90: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
dda0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
ddb0: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
ddc0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
ddd0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
dde0: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
ddf0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
de00: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
de10: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
de20: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
de30: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
de40: 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
de50: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
de60: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
de70: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
de80: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
de90: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
dea0: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
deb0: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
dec0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ded0: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
dee0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
def0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
df00: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
df10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
df20: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
df30: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
df40: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
df50: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
df60: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
df70: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
df80: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
df90: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
dfa0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
dfb0: 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
dfc0: 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
dfd0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
dfe0: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
dff0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
e000: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
e010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
e020: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
e030: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
e040: 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
e050: 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
e060: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
e070: 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
e080: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e090: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
e0a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
e0b0: 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
e0c0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
e0d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
e0e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
e0f0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
e100: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
e110: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e120: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
e130: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
e140: 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
e150: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
e160: 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
e170: 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
e180: 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
e190: 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
e1a0: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
e1b0: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
e1c0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
e1d0: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
e1e0: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
e1f0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
e200: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
e210: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
e220: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
e230: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
e240: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
e250: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
e260: 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
e270: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
e280: 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
e290: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
e2a0: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
e2b0: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
e2c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
e2d0: 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
e2e0: 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
e2f0: 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  ));.#endif..  as
e300: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
e310: 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
e320: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e330: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e340: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
e350: 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
e360: 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
e370: 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
e380: 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
e390: 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
e3a0: 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
e3b0: 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
e3c0: 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
e3d0: 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
e3e0: 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
e3f0: 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
e400: 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
e410: 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
e420: 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
e430: 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
e440: 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
e450: 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
e460: 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
e470: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
e480: 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
e490: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
e4a0: 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20  LITE_NoReadlock 
e4b0: 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
e4c0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
e4d0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
e4e0: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
e4f0: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
e500: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
e510: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
e520: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
e530: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
e540: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
e550: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
e560: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
e570: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
e580: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
e590: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
e5a0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
e5b0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
e5c0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
e5d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e5e0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
e5f0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
e600: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
e610: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
e620: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e630: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
e640: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
e650: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
e660: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
e670: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e680: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
e690: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
e6a0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
e6b0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
e6c0: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
e6d0: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
e6e0: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
e6f0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
e700: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
e710: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
e720: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
e730: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
e740: 30 20 26 26 20 69 73 54 65 6d 70 44 62 3d 3d 30  0 && isTempDb==0
e750: 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
e760: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e770: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
e780: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
e790: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
e7a0: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
e7b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
e7c0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e7d0: 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  te3Malloc(nFullP
e7e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
e7f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e800: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
e810: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
e820: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
e830: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
e840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e850: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
e860: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e870: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
e880: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c     sqlite3OsFull
e890: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
e8a0: 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50  Filename, nFullP
e8b0: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
e8c0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
e8d0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
e8e0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
e8f0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
e900: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
e910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e920: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
e930: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
e940: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
e950: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
e960: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
e970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
e980: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
e990: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
e9a0: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
e9b0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
e9c0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
e9d0: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
e9e0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
e9f0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
ea00: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
ea10: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
ea20: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
ea30: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
ea40: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
ea60: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
ea70: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
ea80: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
ea90: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
eaa0: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
eab0: 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
eac0: 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
ead0: 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
eae0: 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
eaf0: 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
eb00: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
eb10: 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
eb20: 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
eb30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
eb40: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
eb50: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
eb60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
eb70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
eb80: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
eb90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eba0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
ebb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
ebc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ebd0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
ebe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ebf0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
ec00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ec10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ec20: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
ec30: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
ec40: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
ec50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ec60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ec70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ec80: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
ec90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
eca0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
ecb0: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
ecc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ecd0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
ece0: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
ecf0: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
ed00: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
ed10: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
ed20: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
ed30: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
ed40: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
ed50: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
ed60: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
ed70: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
ed80: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
ed90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
eda0: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
edb0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
edc0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
edd0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
ede0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
edf0: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
ee00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
ee10: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
ee20: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
ee30: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
ee40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
ee50: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
ee60: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
ee70: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
ee80: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
ee90: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
eea0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
eeb0: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
eec0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
eed0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
eee0: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
eef0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
ef00: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
ef10: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
ef20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
ef30: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
ef40: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
ef50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
ef60: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
ef70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
ef80: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
ef90: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
efa0: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
efb0: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
efc0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
efd0: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
efe0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
eff0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f000: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
f010: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
f020: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
f030: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
f040: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
f050: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
f060: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
f080: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
f090: 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65  vfsFlags, pageRe
f0a0: 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72  init);.    if( r
f0b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f0c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f0d0: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
f0e0: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
f0f0: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
f100: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
f110: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
f120: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f130: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f140: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
f150: 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
f160: 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
f170: 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
f180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
f190: 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
f1a0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
f1b0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
f1c0: 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
f1d0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
f1e0: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
f1f0: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
f200: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
f210: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
f220: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
f230: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
f240: 65 72 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  er);.#ifdef SQLI
f250: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
f260: 0a 20 20 20 20 70 42 74 2d 3e 73 65 63 75 72 65  .    pBt->secure
f270: 44 65 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64  Delete = 1;.#end
f280: 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  if.    pBt->page
f290: 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
f2a0: 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
f2b0: 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
f2c0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
f2d0: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
f2e0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
f2f0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
f300: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
f310: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
f320: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
f330: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
f340: 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
f350: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f360: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f370: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
f380: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
f390: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
f3a0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f3b0: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
f3c0: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
f3d0: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
f3e0: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
f3f0: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
f400: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
f410: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
f420: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
f430: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
f440: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
f450: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
f460: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
f470: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
f480: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
f490: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
f4a0: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
f4b0: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
f4c0: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
f4d0: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
f4e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f4f0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
f500: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
f510: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f520: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
f530: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
f540: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
f550: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
f560: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
f570: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
f580: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
f590: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
f5a0: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
f5b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
f5c0: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
f5d0: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
f5e0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
f5f0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
f600: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f610: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
f620: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
f630: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
f640: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
f650: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
f660: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
f670: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
f680: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
f690: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
f6a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f6b0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
f6c0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
f6d0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
f6e0: 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
f6f0: 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
f700: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
f710: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
f720: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
f730: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
f740: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
f750: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
f760: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
f770: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
f780: 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
f790: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f7a0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
f7b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f7c0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
f7d0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
f7e0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
f7f0: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
f800: 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
f810: 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
f820: 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
f830: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
f840: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
f850: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42  Shared;.      pB
f860: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
f870: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
f880: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f890: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f8a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
f8b0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
f8c0: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
f8d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
f8e0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
f8f0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
f900: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
f910: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f920: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
f930: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
f940: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
f950: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f960: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
f970: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f980: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f990: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f9a0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
f9b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f9c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f9d0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f9e0: 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
f9f0: 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
fa00: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
fa10: 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
fa20: 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
fa30: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
fa40: 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
fa50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fa60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
fa70: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
fa80: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
fa90: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
faa0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
fab0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
fac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
fad0: 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
fae0: 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
faf0: 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
fb00: 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
fb10: 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
fb20: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
fb30: 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
fb40: 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
fb50: 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
fb60: 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
fb70: 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
fb80: 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
fb90: 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
fba0: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
fbb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fbc0: 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
fbd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
fbe0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
fbf0: 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
fc00: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
fc10: 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
fc20: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
fc30: 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
fc40: 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
fc50: 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
fc60: 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
fc70: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
fc80: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
fc90: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
fca0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
fcb0: 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
fcc0: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
fcd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
fce0: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
fcf0: 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
fd00: 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
fd10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
fd20: 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
fd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
fd40: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
fd50: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
fd60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
fd70: 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
fd80: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
fd90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
fda0: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
fdb0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
fdc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
fdd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
fde0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
fdf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
fe00: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
fe10: 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
fe20: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
fe30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fe40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
fe50: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
fe60: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
fe70: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
fe80: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
fe90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
fea0: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
feb0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
fec0: 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
fed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
fee0: 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
fef0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
ff00: 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
ff10: 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
ff20: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
ff30: 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
ff40: 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
ff50: 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
ff60: 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
ff70: 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
ff80: 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
ff90: 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
ffa0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
ffb0: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
ffc0: 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
ffd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
ffe0: 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
fff0: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
10000 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
10010 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
10020 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
10030 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
10040 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10050 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
10060 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
10070 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
10080 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
10090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
100a0 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
100b0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
100c0 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
100d0 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
100e0 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
100f0 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
10100 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
10110 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
10120 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
10130 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
10140 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
10150 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
10160 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
10170 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
10180 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
10190 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
101a0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
101b0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
101c0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
101d0 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  HE.  sqlite3_mut
101e0 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42  ex *pMaster;.  B
101f0 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
10200 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
10210 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
10220 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
10230 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10240 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73  );.  pMaster = s
10250 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10260 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
10270 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
10280 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10290 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
102a0 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
102b0 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
102c0 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
102d0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
102e0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
102f0 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
10300 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
10310 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10320 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
10330 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
10340 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
10350 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
10360 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10370 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
10380 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
10390 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
103a0 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
103b0 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
103c0 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
103d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
103e0 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
103f0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
10400 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
10410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10420 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
10430 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
10440 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10450 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
10460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
10470 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
10480 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10490 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
104a0 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
104b0 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
104c0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
104d0 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
104e0 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
104f0 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
10500 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
10510 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
10520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10530 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
10540 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10550 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
10560 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
10570 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
10580 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
10590 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
105a0 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e );.  }.}../*.*
105b0 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
105c0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
105d0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
105e0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
105f0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
10600 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
10610 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
10620 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
10630 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
10640 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
10650 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
10660 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
10670 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
10680 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10690 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
106a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
106b0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
106c0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
106d0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
106e0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
106f0 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
10700 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10710 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10720 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10730 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10740 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
10750 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
10760 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
10770 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
10780 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
10790 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
107a0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
107b0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
107c0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
107d0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
107e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
107f0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
10800 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
10810 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
10820 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
10830 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
10840 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
10850 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
10860 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
10870 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
10880 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
10890 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
108a0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
108b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
108c0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
108d0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
108e0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
108f0 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
10900 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
10910 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
10920 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
10930 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
10940 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
10950 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
10960 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
10970 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
10980 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
10990 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
109a0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
109b0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
109c0 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
109d0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
109e0 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
109f0 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
10a00 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
10a10 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
10a20 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
10a30 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
10a40 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
10a50 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
10a60 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
10a70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
10a80 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
10a90 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
10aa0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
10ab0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
10ac0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
10ad0 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
10ae0 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
10af0 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
10b00 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
10b10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
10b20 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
10b30 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
10b40 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
10b50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
10b60 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
10b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
10b80 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
10b90 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10ba0 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
10bb0 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
10bc0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
10bd0 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
10be0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
10bf0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
10c00 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
10c10 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
10c20 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
10c30 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
10c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10c50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
10c60 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
10c70 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
10c80 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
10c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
10ca0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
10cb0 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
10cc0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
10cd0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
10ce0 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
10cf0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
10d00 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
10d10 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
10d20 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
10d30 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
10d40 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
10d50 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
10d60 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
10d70 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
10d80 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
10d90 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
10da0 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
10db0 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
10dc0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
10dd0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
10de0 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
10df0 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
10e00 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
10e10 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
10e20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
10e30 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
10e40 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
10e50 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
10e60 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
10e70 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
10e80 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
10e90 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
10ea0 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
10eb0 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
10ec0 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
10ed0 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
10ee0 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
10ef0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
10f00 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
10f10 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
10f20 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
10f30 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
10f40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
10f50 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
10f60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10f70 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
10f80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
10f90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
10fa0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
10fb0 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
10fc0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
10fd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10fe0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
10ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11000 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
11010 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
11020 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
11030 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
11040 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
11050 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
11060 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
11070 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
11080 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
11090 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
110a0 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
110b0 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
110c0 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
110d0 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
110e0 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
110f0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
11100 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
11110 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
11120 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
11130 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
11140 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
11150 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
11160 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
11170 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
11180 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
11190 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
111a0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
111b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
111c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
111d0 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
111e0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
111f0 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42 74  afetyLevel(.  Bt
11200 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
11210 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
11220 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
11230 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
11240 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20    int level,    
11250 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47           /* PRAG
11260 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20  MA synchronous. 
11270 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c   1=OFF, 2=NORMAL
11280 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69 6e  , 3=FULL */.  in
11290 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20 20  t fullSync,     
112a0 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66       /* PRAGMA f
112b0 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20 69  ullfsync. */.  i
112c0 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63 20  nt ckptFullSync 
112d0 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
112e0 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66  checkpoint_fullf
112f0 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ync */.){.  BtSh
11300 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11310 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
11320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11330 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
11340 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65  ;.  assert( leve
11350 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33  l>=1 && level<=3
11360 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
11370 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
11380 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
11390 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50  etyLevel(pBt->pP
113a0 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c  ager, level, ful
113b0 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c 53  lSync, ckptFullS
113c0 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
113d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
113e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
113f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11400 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11410 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
11420 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
11430 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
11440 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
11450 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
11460 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
11470 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
11480 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11490 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
114a0 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
114b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
114c0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
114d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
114e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
114f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
11500 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11510 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
11520 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
11530 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
11540 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
11550 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
11560 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11570 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11580 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
11590 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
115a0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
115b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
115c0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
115d0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
115e0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
115f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
11600 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
11610 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
11620 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
11630 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
11640 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
11650 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
11660 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
11670 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
11680 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
11690 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
116a0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
116b0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
116c0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
116d0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
116e0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
116f0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
11700 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
11710 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
11720 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
11730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11740 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
11750 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
11760 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
11770 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
11780 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
11790 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
117a0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
117b0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
117c0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
117d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
117e0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
117f0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
11800 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
11810 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
11820 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
11830 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
11840 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
11850 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
11860 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
11870 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
11880 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
11890 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
118a0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
118b0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
118c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
118d0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
118e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
118f0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
11900 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
11910 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11920 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
11930 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11940 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
11950 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
11960 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
11970 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11980 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
11990 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
119a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
119b0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
119c0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
119d0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
119e0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
119f0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
11a00 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
11a10 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
11a20 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11a30 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
11a40 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
11a50 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
11a60 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
11a70 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
11a80 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
11a90 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
11aa0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
11ab0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
11ac0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
11ad0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
11ae0 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
11af0 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
11b00 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
11b10 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
11b20 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
11b30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
11b40 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
11b50 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11b60 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
11b70 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
11b80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11b90 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11ba0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
11bb0 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
11bc0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
11bd0 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
11be0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11c00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
11c10 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
11c20 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
11c30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11c40 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11c50 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
11c60 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
11c70 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
11c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11c90 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
11ca0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11cb0 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
11cc0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
11cd0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
11ce0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
11cf0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
11d00 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
11d10 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
11d20 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
11d30 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
11d40 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
11d50 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
11d60 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
11d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11d80 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
11d90 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11da0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11db0 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
11dc0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
11dd0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
11de0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11df0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11e00 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
11e10 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
11e20 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
11e30 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
11e40 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
11e50 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
11e60 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
11e70 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
11e80 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
11e90 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
11ea0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
11eb0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
11ec0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
11ed0 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
11ee0 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
11ef0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
11f00 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11f10 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11f20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
11f30 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
11f40 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
11f50 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
11f60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11f70 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
11f80 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 75  .** Set the secu
11f90 72 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69 66  reDelete flag if
11fa0 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
11fb0 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
11fc0 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
11fd0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
11fe0 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
11ff0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
12000 73 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20  secureDelete.** 
12010 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
12020 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
12030 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
12040 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
12050 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
12060 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
12070 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
12080 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12090 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
120a0 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
120b0 20 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65    p->pBt->secure
120c0 44 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c 61  Delete = (newFla
120d0 67 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20  g!=0) ? 1 : 0;. 
120e0 20 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74   } .  b = p->pBt
120f0 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b 0a  ->secureDelete;.
12100 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12110 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12120 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   b;.}.#endif /* 
12130 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12140 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
12150 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
12160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
12170 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
12180 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
12190 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
121a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
121b0 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
121c0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
121d0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
121e0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
121f0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
12200 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
12210 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
12220 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
12230 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
12240 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
12250 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
12260 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
12270 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
12280 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
12290 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
122a0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
122b0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
122c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
122d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
122e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
122f0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
12300 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12310 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
12320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12330 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
12340 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
12350 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12360 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
12370 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28  geSizeFixed && (
12380 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
12390 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
123a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
123b0 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
123c0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
123d0 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
123e0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
123f0 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
12400 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
12410 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12420 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
12430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12440 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
12450 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
12460 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
12470 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
12480 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
12490 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
124a0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
124b0 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
124c0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
124d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
124e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
124f0 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
12500 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
12510 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
12520 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12530 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
12540 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
12550 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
12560 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
12570 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
12580 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
12590 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
125a0 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
125b0 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
125c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
125d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
125e0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
125f0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
12600 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
12610 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12620 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
12630 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
12640 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
12650 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
12660 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
12670 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
12680 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
12690 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
126a0 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
126b0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
126c0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
126d0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
126e0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
126f0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
12700 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
12710 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
12720 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
12730 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
12740 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
12750 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
12760 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
12770 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12780 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
12790 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
127a0 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
127b0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
127c0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
127d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
127e0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
127f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12800 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
12810 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
12820 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
12830 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
12840 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
12850 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
12860 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
12870 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
12880 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
12890 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
128a0 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
128b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
128c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
128d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
128e0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
128f0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
12900 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
12910 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
12920 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12930 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
12940 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
12950 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
12960 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
12970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12980 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
12990 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
129a0 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
129b0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
129c0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
129d0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
129e0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
129f0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
12a00 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
12a10 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
12a20 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
12a30 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
12a40 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
12a50 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
12a60 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
12a70 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
12a80 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
12a90 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
12aa0 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
12ab0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
12ac0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
12ad0 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
12ae0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
12af0 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
12b00 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
12b10 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
12b20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
12b30 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
12b40 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
12b50 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
12b60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
12b70 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12b80 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
12b90 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
12ba0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
12bb0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
12bc0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
12bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
12be0 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
12bf0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12c00 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12c10 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
12c20 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
12c30 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
12c40 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
12c50 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
12c60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
12c70 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12c90 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
12ca0 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
12cb0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
12cc0 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
12cd0 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
12ce0 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
12cf0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
12d00 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
12d10 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
12d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12d30 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
12d40 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
12d50 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
12d60 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
12d70 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
12d80 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
12d90 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
12da0 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
12db0 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
12dc0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
12dd0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
12de0 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
12df0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
12e00 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
12e10 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
12e20 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
12e30 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
12e40 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
12e50 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
12e60 20 26 26 20 70 42 74 2d 3e 64 6f 4e 6f 74 55 73   && pBt->doNotUs
12e70 65 57 41 4c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eWAL==0 ){.     
12e80 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
12e90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12ea0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
12eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
12ec0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
12ed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12ee0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
12ef0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12f00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12f10 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ( isOpen==0 ){. 
12f20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
12f30 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
12f40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12f50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
12f60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12f70 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
12f80 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
12f90 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
12fa0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
12fb0 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
12fc0 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
12fd0 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
12fe0 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
12ff0 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
13000 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
13010 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
13020 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
13030 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
13040 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
13050 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
13060 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
13070 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
13080 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
13090 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
130a0 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
130b0 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
130c0 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
130d0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
130e0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
130f0 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
13100 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
13110 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
13120 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
13130 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
13140 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
13150 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
13160 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
13170 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
13180 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
13190 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
131a0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
131b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
131c0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
131d0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
131e0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
131f0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
13200 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
13210 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
13220 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
13230 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
13240 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
13250 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
13260 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
13270 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
13280 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
13290 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
132a0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
132b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
132c0 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
132d0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
132e0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
132f0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
13300 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
13310 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
13320 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
13330 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
13340 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
13350 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
13360 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
13370 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
13380 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
13390 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
133a0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
133b0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
133c0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
133d0 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
133e0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
133f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13400 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
13410 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
13420 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
13460 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
13470 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
13480 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
13490 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
134a0 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
134b0 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
134c0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
134d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
134e0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
134f0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13500 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
13510 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
13520 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13530 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13540 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
13550 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
13560 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
13570 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
13580 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
13590 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
135a0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
135b0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
135c0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
135d0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
135e0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
135f0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
13600 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
13610 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
13620 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
13630 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
13640 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
13650 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
13660 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
13670 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
13680 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
13690 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
136a0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
136b0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
136c0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
136d0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
136e0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
136f0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
13700 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
13710 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
13720 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
13730 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
13740 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
13750 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
13760 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
13770 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
13780 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
13790 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
137a0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
137b0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
137c0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
137d0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
137e0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
137f0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
13800 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
13810 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
13820 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
13830 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
13840 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
13850 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
13860 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
13870 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
13880 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
13890 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
138a0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
138b0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
138c0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
138d0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
138e0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
138f0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
13900 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
13910 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
13920 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
13930 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
13940 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
13950 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
13960 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
13970 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
13980 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
13990 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
139a0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
139b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139c0 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
139d0 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
139e0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
139f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
13a00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13a10 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
13a20 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
13a30 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
13a40 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
13a50 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
13a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
13a70 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
13a80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13a90 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
13aa0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
13ab0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
13ac0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13ad0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
13ae0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
13af0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
13b00 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
13b10 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
13b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
13b30 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
13b40 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13b60 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13b70 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
13b80 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
13b90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13ba0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13bb0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
13bc0 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42  pCursor==0 || pB
13bd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13be0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
13bf0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
13c00 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
13c10 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
13c20 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e1!=0 ){.    ass
13c30 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
13c40 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
13c50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
13c60 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
13c70 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20  >pPager)==1 );. 
13c80 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13c90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
13ca0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
13cb0 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
13cc0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
13cd0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
13ce0 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74   If pBt points t
13cf0 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20  o an empty file 
13d00 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61  then convert tha
13d10 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20  t empty file.** 
13d20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79  into a new empty
13d30 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
13d40 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
13d50 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  rst page of.** t
13d60 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
13d70 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
13d80 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
13d90 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
13da0 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
13db0 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
13dc0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
13dd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13de0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
13df0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
13e00 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
13e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13e20 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
13e30 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
13e40 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
13e50 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
13e60 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
13e70 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
13e80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
13e90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13ea0 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
13eb0 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
13ec0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
13ed0 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
13ee0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
13ef0 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74  er)==16 );.  dat
13f00 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42  a[16] = (u8)((pB
13f10 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26  t->pageSize>>8)&
13f20 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37  0xff);.  data[17
13f30 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
13f40 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66  ageSize>>16)&0xf
13f50 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  f);.  data[18] =
13f60 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
13f70 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
13f80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
13f90 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
13fa0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
13fb0 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
13fc0 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
13fd0 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
13fe0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
13ff0 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
14000 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
14010 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
14020 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
14030 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
14040 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
14050 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
14060 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
14070 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
14080 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
14090 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
140a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
140b0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
140c0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
140d0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
140e0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
140f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
14100 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
14110 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
14120 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
14130 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
14140 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14150 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
14160 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
14170 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
14180 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
14190 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
141a0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
141b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
141c0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
141d0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
141e0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
141f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
14200 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
14210 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
14220 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
14230 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
14240 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
14250 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
14260 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
14270 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
14280 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
14290 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
142a0 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
142b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
142c0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
142d0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
142e0 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
142f0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
14300 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
14310 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
14320 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
14330 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
14340 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
14350 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
14360 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
14370 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
14380 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
14390 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
143a0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
143b0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
143c0 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
143d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
143e0 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
143f0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
14400 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
14410 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
14420 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
14430 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
14440 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
14450 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
14460 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
14470 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
14480 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14490 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
144a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
144b0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
144c0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
144d0 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
144e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
144f0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
14500 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
14510 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
14520 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
14530 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
14540 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
14550 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
14560 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
14570 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
14580 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
14590 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
145a0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
145b0 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
145c0 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
145d0 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
145e0 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
145f0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
14600 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
14610 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
14620 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
14630 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
14640 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
14650 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
14660 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
14670 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
14680 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
14690 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
146a0 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
146b0 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
146c0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
146d0 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
146e0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
146f0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
14700 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
14710 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
14720 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
14730 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
14740 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
14750 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
14760 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
14770 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
14780 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
14790 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
147a0 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
147b0 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
147c0 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
147d0 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
147e0 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
147f0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
14800 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
14810 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
14820 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
14830 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
14840 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
14850 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
14860 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
14870 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
14880 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
14890 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
148a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
148b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
148c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
148d0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
148e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
148f0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14900 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
14910 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
14920 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
14930 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
14940 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
14950 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
14960 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
14970 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
14980 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
14990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
149a0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
149b0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
149c0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
149d0 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
149e0 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
149f0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
14a00 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
14a10 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
14a20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
14a30 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
14a40 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
14a50 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
14a60 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
14a70 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
14a80 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
14a90 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
14aa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14ab0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
14ac0 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
14ad0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
14ae0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
14af0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
14b00 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
14b10 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
14b20 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
14b30 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
14b40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
14b50 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
14b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
14b70 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
14b80 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
14b90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
14ba0 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
14bb0 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a  t->isPending ){.
14bc0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
14bd0 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
14be0 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
14bf0 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
14c00 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
14c10 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
14c20 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
14c30 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
14c40 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
14c50 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
14c60 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
14c70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
14c80 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14ca0 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
14cb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
14cc0 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
14cd0 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
14ce0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14cf0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
14d00 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
14d10 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
14d20 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
14d30 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
14d40 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
14d50 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
14d60 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
14d70 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
14d80 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
14d90 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
14da0 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
14db0 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
14dc0 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
14dd0 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
14de0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
14df0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
14e00 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
14e10 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
14e20 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
14e30 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
14e40 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14e50 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c  ..  pBt->initial
14e60 6c 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28 70  lyEmpty = (u8)(p
14e70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a 20  Bt->nPage==0);. 
14e80 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
14e90 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
14ea0 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
14eb0 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
14ec0 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
14ed0 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
14ee0 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
14ef0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
14f00 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
14f10 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
14f20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
14f30 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
14f40 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
14f50 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
14f60 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
14f70 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
14f80 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
14f90 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
14fa0 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
14fb0 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
14fc0 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
14fd0 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
14fe0 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
14ff0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
15000 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
15010 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
15020 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
15030 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
15040 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
15050 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
15060 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
15070 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
15080 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
15090 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
150a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
150b0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
150c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
150d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
150e0 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
150f0 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
15100 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
15110 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
15120 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15140 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
15150 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
15160 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15170 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
15180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15190 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
151a0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
151b0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
151c0 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
151d0 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
151e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
151f0 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
15200 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
15210 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
15220 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
15230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15240 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
15250 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
15260 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
15270 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
15280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15290 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
152a0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
152b0 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e   ){..assert( p->
152c0 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
152d0 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
152e0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
152f0 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
15300 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
15310 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
15320 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
15330 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
15340 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
15350 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15360 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
15370 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
15380 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
15390 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
153a0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
153b0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
153c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
153d0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
153e0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
153f0 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
15400 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
15410 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
15420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15430 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15440 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
15450 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
15460 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
15470 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
15480 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
15490 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29  = (u8)(wrflag>1)
154a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
154b0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
154c0 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
154d0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
154e0 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
154f0 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
15500 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
15510 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
15520 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
15530 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
15540 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
15550 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
15560 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
15570 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
15580 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
15590 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
155a0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
155b0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
155c0 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
155d0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
155e0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
155f0 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
15600 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
15610 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
15620 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
15630 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
15640 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
15650 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
15660 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
15670 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
15680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
156a0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
156b0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
156c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
156d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
156e0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
156f0 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
15700 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
15710 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
15720 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
15730 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
15740 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
15750 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
15760 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
15770 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
15780 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
15790 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
157a0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
157b0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
157c0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
157d0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
157e0 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
157f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15800 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
15810 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
15820 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
15830 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
15840 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
15850 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15860 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
15870 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
15880 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
15890 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
158a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
158b0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
158c0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
158d0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
158e0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
158f0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
15900 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
15910 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
15920 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
15930 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
15940 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
15950 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
15960 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
15970 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
15980 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
159b0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
159c0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
159f0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
15a00 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
15a10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
15a40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15a50 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
15a60 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
15a70 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
15a80 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
15a90 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
15aa0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15ab0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
15ac0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15ad0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
15ae0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
15af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15b00 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
15b10 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
15b20 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
15b30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
15b40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
15b50 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
15b60 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
15b70 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
15b80 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
15b90 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
15ba0 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
15bb0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
15bc0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
15bd0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
15be0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
15bf0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
15c00 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
15c10 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
15c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15c30 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
15c40 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
15c50 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
15c60 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
15c70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
15c80 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
15c90 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
15ca0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
15cb0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
15cc0 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
15cd0 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
15ce0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
15cf0 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
15d00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
15d10 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
15d20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
15d30 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
15d40 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
15d50 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
15d60 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
15d70 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
15d80 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
15d90 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
15da0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
15db0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
15dc0 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
15dd0 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
15de0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
15df0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
15e00 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15e20 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
15e30 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
15e40 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
15e50 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
15e60 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
15e70 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
15e80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
15e90 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
15ea0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
15eb0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
15ec0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
15ed0 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
15ee0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
15ef0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
15f00 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
15f10 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
15f20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
15f30 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
15f40 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
15f50 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
15f60 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
15f70 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
15f80 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
15f90 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
15fa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15fb0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
15fc0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
15fd0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
15fe0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
15ff0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
16000 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
16010 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
16020 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
16030 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
16040 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
16050 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
16060 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
16070 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
16080 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
16090 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
160a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
160b0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
160c0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
160d0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
160e0 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
160f0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
16100 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
16110 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
16120 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69  l;..    btreeIni
16130 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
16140 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
16150 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
16160 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
16170 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
16180 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
16190 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
161a0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
161b0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
161c0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
161d0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62   info;.        b
161e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
161f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
16200 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
16210 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
16220 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
16230 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
16240 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
16250 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20  Overflow]) ){.  
16260 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
16270 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
16280 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
16290 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
162a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
162b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
162c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
162d0 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
162e0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
162f0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
16300 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
16310 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16330 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
16340 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
16350 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
16360 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
16370 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
16380 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16390 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
163a0 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
163b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
163c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
163d0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
163e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
163f0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
16400 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
16410 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
16420 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
16430 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
16440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16450 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
16460 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
16470 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
16480 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
16490 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
164a0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
164b0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
164c0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
164d0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
164e0 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
164f0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
16500 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
16510 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
16520 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
16530 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
16540 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
16550 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
16560 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
16570 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
16580 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
16590 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
165a0 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
165b0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
165c0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
165d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
165e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
165f0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
16600 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
16610 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
16620 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
16630 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
16640 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
16650 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
16660 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
16670 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
16680 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
16690 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
166a0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
166b0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
166c0 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
166d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
166e0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
166f0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
16700 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
16710 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
16720 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
16730 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
16740 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
16750 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
16760 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
16770 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
16780 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
16790 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
167a0 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
167b0 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
167c0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
167d0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
167e0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
167f0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
16800 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
16810 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
16820 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
16830 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
16840 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
16850 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
16860 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16870 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
16880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
16890 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
168a0 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
168b0 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
168c0 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
168d0 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
168e0 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
168f0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
16900 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
16910 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
16920 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
16930 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
16940 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
16950 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
16960 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
16970 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
16980 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
16990 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
169a0 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
169b0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
169c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
169d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
169e0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
169f0 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
16a00 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
16a10 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
16a20 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
16a30 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
16a40 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
16a50 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
16a60 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
16a70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
16a80 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
16a90 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
16aa0 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
16ab0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
16ac0 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
16ad0 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
16ae0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
16af0 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
16b00 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
16b10 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
16b20 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
16b30 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
16b40 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
16b50 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
16b60 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
16b70 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
16b80 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
16b90 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
16ba0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
16bb0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
16bc0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
16bd0 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
16be0 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
16bf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16c00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
16c10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
16c20 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
16c30 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
16c40 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
16c50 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
16c60 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
16c70 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
16c80 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
16c90 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
16ca0 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
16cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16cd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16ce0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16cf0 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
16d00 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
16d10 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
16d20 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
16d30 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
16d40 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
16d50 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
16d60 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
16d70 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
16d80 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
16d90 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
16da0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
16db0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
16dc0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
16dd0 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
16de0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
16df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16e00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16e10 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
16e20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
16e30 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
16e40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
16e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16e60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
16e70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
16e80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16e90 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
16ea0 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
16eb0 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
16ec0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
16ed0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
16ee0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
16ef0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16f00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
16f10 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
16f20 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
16f30 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
16f40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16f50 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
16f60 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
16f70 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
16f80 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
16f90 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
16fa0 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
16fb0 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
16fc0 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
16fd0 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
16fe0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
16ff0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
17000 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
17010 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
17020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17030 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
17040 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
17050 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a   therefore no.**
17060 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e   point in callin
17070 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
17080 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
17090 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
170a0 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c  * More specificl
170b0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
170c0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
170d0 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a  organize the .**
170e0 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61   database so tha
170f0 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
17100 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
17110 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20  ently in use.** 
17120 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
17130 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  use..**.** If th
17140 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72  e nFin parameter
17150 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
17160 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
17170 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
17180 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
17190 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
171a0 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
171b0 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
171c0 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
171d0 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
171e0 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
171f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
17200 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17210 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
17220 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
17230 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
17240 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  .  If nFin is ze
17250 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
17260 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61  d that.** incrVa
17270 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20  cuumStep() will 
17280 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69  be called a fini
17290 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  te amount of tim
172a0 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20  es.** which may 
172b0 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79  or may not empty
172c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
172d0 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75  A full autovacuu
172e0 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e  m.** has nFin>0.
172f0 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72    A "PRAGMA incr
17300 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20  emental_vacuum" 
17310 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a  has nFin==0..*/.
17320 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
17330 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
17340 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
17350 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
17360 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
17370 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
17380 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
17390 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
173a0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
173b0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
173c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
173d0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
173e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
173f0 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
17400 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
17410 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
17420 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
17430 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17440 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
17450 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
17460 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
17470 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
17480 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
17490 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
174a0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
174b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
174c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
174d0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
174e0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
174f0 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
17500 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
17510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17520 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17530 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
17540 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17550 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
17560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17570 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
17580 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
17590 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
175a0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
175b0 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
175c0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
175d0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
175e0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
175f0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
17600 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
17610 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d   if nFin is non-
17620 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
17630 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
17640 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
17650 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
17660 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
17670 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
17680 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
17690 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
176a0 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
176b0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
176c0 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
176d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
176e0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
176f0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
17700 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
17710 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
17720 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
17730 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
17740 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a  g, iLastPg, 1);.
17750 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17770 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17780 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17790 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
177a0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
177b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
177c0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
177d0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
177e0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
177f0 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
17800 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
17810 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
17820 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
17830 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
17840 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63  astPg;..      rc
17850 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
17860 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
17870 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
17880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
178a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
178b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  }..      /* If n
178c0 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Fin is zero, thi
178d0 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
178e0 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
178f0 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
17900 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
17910 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
17920 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
17930 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
17940 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17950 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
17960 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73  hand, if nFin is
17970 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
17980 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
17990 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
179a0 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
179b0 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
179c0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
179d0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
179e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
179f0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
17a00 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
17a10 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
17a20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
17a30 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
17a40 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
17a50 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b  &iFreePg, 0, 0);
17a60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17a80 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
17a90 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
17aa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17ab0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
17ac0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17ad0 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
17ae0 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30   }while( nFin!=0
17af0 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
17b00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17b10 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
17b20 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
17b30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17b40 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67  gerWrite(pLastPg
17b50 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
17b60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17b80 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
17b90 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
17ba0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
17bb0 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30  iFreePg, nFin!=0
17bc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17bd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
17be0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
17bf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17c00 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
17c10 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
17c20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46   }.  }..  if( nF
17c30 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  in==0 ){.    iLa
17c40 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c  stPg--;.    whil
17c50 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
17c60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
17c70 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47  t)||PTRMAP_ISPAG
17c80 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
17c90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52  ){.      if( PTR
17ca0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17cb0 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20  iLastPg) ){.    
17cc0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
17cd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
17ce0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
17cf0 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20   iLastPg, &pPg, 
17d00 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
17d10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17d20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17d30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
17d40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17d50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
17d60 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
17d70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17d80 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
17d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17da0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
17db0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17dc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17dd0 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
17de0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
17df0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
17e00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c  (pBt->pPager, iL
17e10 61 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74 2d  astPg);.    pBt-
17e20 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
17e30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17e40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17e50 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
17e60 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
17e70 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
17e80 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
17e90 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
17ea0 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
17eb0 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
17ec0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
17ed0 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
17ee0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
17ef0 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
17f00 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
17f10 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
17f20 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
17f30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
17f40 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
17f50 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
17f60 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
17f70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
17f80 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
17f90 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
17fa0 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
17fb0 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
17fc0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
17fd0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
17fe0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17ff0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
18000 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
18010 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
18020 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
18030 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
18040 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
18050 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
18060 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
18070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
18080 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
18090 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
180a0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
180b0 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56  ;.    rc = incrV
180c0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30  acuumStep(pBt, 0
180d0 2c 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  , btreePagecount
180e0 28 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28 20  (pBt));.    if( 
180f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18100 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18110 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
18120 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
18130 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
18140 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
18150 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
18160 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
18170 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
18180 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
181a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
181b0 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
181c0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
181d0 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
181e0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
181f0 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
18200 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
18210 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
18220 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
18230 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
18240 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
18250 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
18260 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18270 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
18280 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
18290 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
182a0 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
182b0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
182c0 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
182d0 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
182e0 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
182f0 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
18300 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
18310 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
18320 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
18330 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
18340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
18350 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
18360 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
18370 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
18380 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
18390 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
183a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
183b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
183c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
183d0 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
183e0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
183f0 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
18400 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
18410 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
18420 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
18430 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nFin;         /*
18440 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
18450 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74   in database aft
18460 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67  er autovacuuming
18470 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72   */.    Pgno nFr
18480 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ee;        /* Nu
18490 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
184a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
184b0 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50  itially */.    P
184c0 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
184d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
184e0 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
184f0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
18500 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20  gno iFree;      
18510 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61    /* The next pa
18520 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ge to be freed *
18530 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79  /.    int nEntry
18540 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
18550 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
18560 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
18570 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
18580 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
18590 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
185a0 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
185b0 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
185c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
185d0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
185e0 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
185f0 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
18600 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
18610 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
18620 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
18630 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
18640 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
18650 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
18660 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
18670 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
18680 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
18690 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
186a0 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
186b0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
186c0 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
186d0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
186e0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
186f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18700 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
18710 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
18720 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
18730 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
18740 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
18750 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20  ableSize/5;.    
18760 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
18770 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
18780 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
18790 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
187a0 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  .    nFin = nOri
187b0 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
187c0 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72  map;.    if( nOr
187d0 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
187e0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
187f0 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
18800 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
18810 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
18820 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
18830 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
18840 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
18850 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18860 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
18870 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n--;.    }.    i
18880 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
18890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
188a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20  RRUPT_BKPT;..   
188b0 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
188c0 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
188d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
188e0 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
188f0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
18900 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
18910 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
18920 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
18930 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
18940 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
18950 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
18960 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
18970 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
18980 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
18990 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
189a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
189b0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
189c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
189d0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
189e0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
189f0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
18a00 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
18a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18a20 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
18a30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69  pBt->pPager, nFi
18a40 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  n);.      pBt->n
18a50 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
18a60 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
18a70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18a80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
18a90 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
18aa0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
18ab0 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
18ac0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
18ad0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
18ae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
18af0 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
18b00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
18b10 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
18b20 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
18b30 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
18b40 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
18b50 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
18b60 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
18b70 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
18b80 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
18b90 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
18ba0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
18bb0 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
18bc0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
18bd0 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
18be0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
18bf0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
18c00 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
18c10 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
18c20 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
18c30 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
18c40 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
18c50 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
18c60 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
18c70 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
18c80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
18c90 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
18ca0 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
18cb0 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
18cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
18cd0 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
18ce0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
18cf0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
18d00 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
18d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18d20 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
18d30 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
18d40 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
18d50 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
18d60 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
18d70 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
18d80 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
18d90 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
18da0 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
18db0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
18dc0 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
18dd0 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
18de0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
18df0 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
18e00 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
18e10 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
18e20 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
18e30 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
18e40 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
18e50 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
18e60 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
18e70 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
18e80 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
18e90 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
18ea0 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
18eb0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
18ec0 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
18ed0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18ee0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
18ef0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
18f00 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
18f10 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
18f20 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
18f30 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
18f40 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
18f50 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
18f60 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
18f70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
18f80 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
18f90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18fa0 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
18fb0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
18fc0 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
18fd0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
18fe0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
18ff0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
19000 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
19010 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
19020 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
19030 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
19040 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
19050 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
19060 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
19070 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
19080 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
19090 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
190a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
190b0 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
190c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
190d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
190e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
190f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
19100 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
19110 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19120 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
19130 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19150 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
19160 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
19170 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
19180 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
19190 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
191a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
191b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
191c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
191d0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
191e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
191f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
19200 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19210 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
19220 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
19230 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
19240 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19250 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
19260 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19270 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19280 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
19290 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
192a0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
192b0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
192c0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
192d0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
192e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
192f0 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
19300 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
19310 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19320 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
19330 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
19340 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
19350 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48  ;..  btreeClearH
19360 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
19370 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
19380 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  >TRANS_NONE && p
19390 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ->db->activeVdbe
193a0 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Cnt>1 ){.    /* 
193b0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  If there are oth
193c0 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  er active statem
193d0 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ents that belong
193e0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
193f0 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c  e.    ** handle,
19400 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
19410 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
19420 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72  ction. The other
19430 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20   statements.    
19440 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ** may still be 
19450 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
19460 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
19470 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53     downgradeAllS
19480 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
19490 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ocks(p);.    p->
194a0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
194b0 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
194c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e     /* If the han
194d0 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64  dle had any kind
194e0 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
194f0 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
19500 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  the .    ** tran
19510 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66  saction count of
19520 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
19530 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
19540 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20  ction count .   
19550 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73   ** reaches 0, s
19560 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
19570 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
19580 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
19590 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20  eeIfUnused().   
195a0 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77   ** call below w
195b0 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
195c0 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ager.  */.    if
195d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
195e0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
195f0 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
19600 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
19610 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  p);.      pBt->n
19620 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
19630 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d       if( 0==pBt-
19640 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
19650 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
19660 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
19670 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  ANS_NONE;.      
19680 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
19690 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Set the current 
196a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
196b0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
196c0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
196d0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20      ** pager if 
196e0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
196f0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
19700 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
19710 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ion.  */.    p->
19720 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
19730 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  NONE;.    unlock
19740 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
19750 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
19760 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
19770 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
19780 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
19790 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
197a0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
197b0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
197c0 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
197d0 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
197e0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
197f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
19800 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
19810 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
19820 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
19830 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
19840 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
19850 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
19860 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
19870 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
19880 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
19890 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
198a0 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
198b0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
198c0 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
198d0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
198e0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
198f0 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
19900 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
19910 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
19920 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
19930 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
19940 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
19950 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
19960 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
19970 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
19980 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
19990 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
199a0 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
199b0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
199c0 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
199d0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
199e0 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
199f0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
19a00 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
19a10 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
19a20 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
19a30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
19a40 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
19a50 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
19a60 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
19a70 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
19a80 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
19a90 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
19aa0 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
19ab0 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
19ac0 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
19ad0 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
19ae0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
19af0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
19b00 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
19b10 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
19b20 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
19b30 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
19b40 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
19b50 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
19b60 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
19b70 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
19b80 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
19b90 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
19ba0 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
19bb0 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
19bc0 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
19bd0 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
19be0 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
19bf0 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
19c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
19c10 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
19c20 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
19c30 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
19c40 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
19c50 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
19c60 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
19c70 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
19c80 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
19c90 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
19ca0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
19cb0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
19cc0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
19cd0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
19ce0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
19cf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19d00 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
19d10 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
19d20 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
19d30 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
19d40 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
19d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
19d60 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19d70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
19d80 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
19d90 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
19da0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
19db0 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
19dc0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
19dd0 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
19de0 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
19df0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
19e00 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
19e10 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
19e20 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
19e30 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
19e40 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
19e50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
19e60 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
19e70 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
19e80 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
19e90 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
19ea0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
19eb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19ec0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
19ed0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
19ee0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19ef0 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
19f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
19f10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19f20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19f30 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
19f40 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19f50 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
19f60 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
19f70 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
19f80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19f90 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
19fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19fb0 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
19fc0 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
19fd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19fe0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
19ff0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1a000 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a010 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
1a020 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1a030 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
1a040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a050 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1a060 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1a070 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
1a080 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1a090 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1a0a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1a0b0 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
1a0c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1a0d0 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
1a0e0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
1a0f0 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
1a100 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
1a110 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
1a120 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
1a130 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
1a140 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
1a150 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
1a160 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
1a170 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1a180 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  , a write-cursor
1a190 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
1a1a0 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
1a1b0 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20  e of writing to 
1a1c0 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68  the databse.  Th
1a1d0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72  at means the cur
1a1e0 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69  sor was.** origi
1a1f0 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  nally opened for
1a200 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65   writing and the
1a210 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20   cursor has not 
1a220 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62  be disabled.** b
1a230 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61  y having its sta
1a240 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55  te changed to CU
1a250 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73  RSOR_FAULT..*/.s
1a260 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
1a270 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
1a280 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
1a290 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
1a2a0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
1a2b0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
1a2c0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
1a2d0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
1a2e0 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
1a2f0 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  g && pCur->eStat
1a300 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1a310 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1a320 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1a330 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1a340 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1a350 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1a360 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1a370 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1a380 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1a390 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65  ursor on BtShare
1a3a0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
1a3b0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
1a3c0 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
1a3d0 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  is tripped, incl
1a3e0 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68  uding cursors th
1a3f0 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  at belong.** to 
1a400 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
1a410 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1a420 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61  happen to be sha
1a430 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68  ring.** the cach
1a440 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
1a450 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a460 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
1a470 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
1a480 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72  curs..** All cur
1a490 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73  sors using the s
1a4a0 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62  ame cache must b
1a4b0 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20  e tripped.** to 
1a4c0 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
1a4d0 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  m trying to use 
1a4e0 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a  the btree after.
1a4f0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ** the rollback.
1a500 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d    The rollback m
1a510 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20  ay have deleted 
1a520 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76  tables.** or mov
1a530 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73  ed root pages, s
1a540 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
1a550 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76  icient to.** sav
1a560 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
1a570 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
1a580 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a  cursor must be.*
1a590 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
1a5a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1a5b0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1a5c0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
1a5d0 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20   int errCode){. 
1a5e0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1a5f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a600 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72  r(pBtree);.  for
1a610 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
1a620 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1a630 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
1a640 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   i;.    sqlite3B
1a650 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1a660 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74  p);.    p->eStat
1a670 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
1a680 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78  ;.    p->skipNex
1a690 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20  t = errCode;.   
1a6a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e   for(i=0; i<=p->
1a6b0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1a6c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a6d0 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1a6e0 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
1a6f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1a700 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1a710 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a  ave(pBtree);.}..
1a720 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
1a730 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
1a740 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c  n progress.  All
1a750 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
1a760 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79  .** invalided by
1a770 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
1a780 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
1a790 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a   use a cursor.**
1a7a0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
1a7b0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
1a7c0 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
1a7d0 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a  n will result.**
1a7e0 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   in an error..**
1a7f0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1a800 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1a810 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1a820 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1a830 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1a840 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1a850 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1a860 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1a870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a880 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65  eeRollback(Btree
1a890 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1a8a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a8b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
1a8c0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
1a8d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a8e0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76  r(p);.  rc = sav
1a8f0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1a900 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
1a910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1a920 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72  ED_CACHE.  if( r
1a930 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a940 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
1a950 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74   horrible situat
1a960 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61  ion. An IO or ma
1a970 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1a980 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  urred whilst.   
1a990 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
1a9a0 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
1a9b0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
1a9c0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
1a9d0 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
1a9e0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
1a9f0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
1aa00 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
1aa10 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
1aa20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
1aa30 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
1aa40 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
1aa50 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
1aa60 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
1aa70 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
1aa80 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
1aa90 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
1aaa0 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
1aab0 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
1aac0 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
1aad0 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
1aae0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
1aaf0 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
1ab00 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
1ab10 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1ab20 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b  lCursors(p, rc);
1ab30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
1ab40 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1ab50 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1ab60 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1ab70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1ab80 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
1ab90 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
1aba0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
1abb0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
1abc0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1abd0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1abe0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
1abf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1ac00 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
1ac10 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
1ac20 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
1ac30 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
1ac40 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
1ac50 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
1ac60 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
1ac70 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
1ac80 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
1ac90 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
1aca0 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
1acb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
1acc0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
1acd0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
1ace0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1acf0 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
1ad00 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
1ad10 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
1ad20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
1ad30 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
1ad40 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
1ad50 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1ad60 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1ad70 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
1ad80 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
1ad90 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
1ada0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1adb0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
1adc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1add0 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
1ade0 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74  ssert( countWrit
1adf0 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30  eCursors(pBt)==0
1ae00 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
1ae10 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1ae20 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  NS_READ;.  }..  
1ae30 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1ae40 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1ae50 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1ae60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ae70 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
1ae80 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1ae90 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1aea0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63  ransaction can c
1aeb0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
1aec0 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
1aed0 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
1aee0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
1aef0 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
1af00 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
1af10 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
1af20 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
1af30 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
1af40 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
1af50 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
1af60 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
1af70 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
1af80 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
1af90 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
1afa0 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1afb0 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
1afc0 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
1afd0 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
1afe0 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
1aff0 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
1b000 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
1b010 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
1b020 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
1b030 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
1b040 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
1b050 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
1b060 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
1b070 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
1b080 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
1b090 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
1b0a0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1b0b0 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
1b0c0 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
1b0d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1b0e0 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
1b0f0 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
1b100 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
1b110 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1b120 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
1b130 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
1b140 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
1b150 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
1b160 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
1b170 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
1b180 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
1b190 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1b1a0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
1b1b0 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
1b1c0 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
1b1d0 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
1b1e0 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
1b1f0 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
1b200 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
1b210 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
1b220 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
1b230 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
1b240 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
1b250 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1b260 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
1b270 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
1b280 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
1b290 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1b2a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1b2b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b2c0 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
1b2d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1b2e0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1b2f0 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64  ssert( pBt->read
1b300 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
1b310 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
1b320 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1b330 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
1b340 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
1b350 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1b360 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1b370 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
1b380 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
1b390 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
1b3a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b3b0 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
1b3c0 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
1b3d0 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
1b3e0 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
1b3f0 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
1b400 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
1b410 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
1b420 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
1b430 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1b440 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
1b450 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
1b460 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
1b470 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
1b480 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1b490 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
1b4a0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1b4b0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1b4c0 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
1b4d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b4e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1b4f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b500 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
1b510 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
1b520 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
1b530 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
1b540 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
1b550 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
1b560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
1b570 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
1b580 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
1b590 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
1b5a0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
1b5b0 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
1b5c0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
1b5d0 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
1b5e0 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
1b5f0 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
1b600 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1b610 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
1b620 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
1b630 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
1b640 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
1b650 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
1b660 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
1b670 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
1b680 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
1b690 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
1b6a0 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
1b6b0 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
1b6c0 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
1b6d0 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
1b6e0 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
1b6f0 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
1b700 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
1b710 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
1b720 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
1b730 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
1b740 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
1b750 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
1b760 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
1b770 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b780 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
1b790 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1b7a0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
1b7b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1b7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
1b7d0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
1b7e0 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
1b7f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
1b800 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
1b810 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
1b820 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
1b830 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
1b840 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
1b850 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b860 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
1b870 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
1b880 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1b890 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
1b8a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1b8b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b8c0 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
1b8d0 30 20 26 26 20 70 42 74 2d 3e 69 6e 69 74 69 61  0 && pBt->initia
1b8e0 6c 6c 79 45 6d 70 74 79 20 29 20 70 42 74 2d 3e  llyEmpty ) pBt->
1b8f0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
1b900 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1b910 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
1b920 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
1b930 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
1b940 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
1b950 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1b960 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
1b970 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
1b980 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
1b990 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
1b9a0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
1b9b0 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
1b9c0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1b9d0 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
1b9e0 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
1b9f0 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
1ba00 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1ba10 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
1ba20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1ba30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1ba40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ba50 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1ba60 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
1ba70 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
1ba80 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
1ba90 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
1baa0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1bab0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1bac0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1bad0 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
1bae0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
1baf0 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
1bb00 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
1bb10 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
1bb20 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
1bb30 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
1bb40 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1bb50 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
1bb60 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
1bb70 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1bb80 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
1bb90 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
1bba0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
1bbb0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
1bbc0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1bbd0 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
1bbe0 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
1bbf0 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
1bc00 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
1bc10 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
1bc20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
1bc30 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
1bc40 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
1bc50 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
1bc60 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
1bc70 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
1bc80 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
1bc90 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
1bca0 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
1bcb0 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
1bcc0 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
1bcd0 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
1bce0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
1bcf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1bd00 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
1bd10 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
1bd20 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
1bd30 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
1bd40 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
1bd50 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
1bd60 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
1bd70 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
1bd80 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
1bd90 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
1bda0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
1bdb0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
1bdc0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
1bdd0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
1bde0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
1bdf0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
1be00 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
1be10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
1be20 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
1be30 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
1be40 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
1be50 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
1be60 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
1be70 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
1be80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1be90 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
1bea0 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
1beb0 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
1bec0 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
1bed0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1bee0 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
1bef0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
1bf00 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
1bf10 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
1bf20 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1bf30 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
1bf40 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1bf50 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1bf60 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
1bf70 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
1bf80 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
1bf90 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
1bfa0 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
1bfb0 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1bfc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1bfd0 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
1bfe0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1c010 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1c020 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c040 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1c050 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1c060 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1c090 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1c0a0 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1c0b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c0c0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1c0d0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1c0e0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1c0f0 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
1c100 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c120 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
1c130 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
1c140 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c150 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
1c160 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1c170 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
1c180 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
1c190 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1c1a0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
1c1b0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1c1c0 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
1c1d0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1c1e0 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
1c1f0 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
1c200 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
1c210 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
1c220 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
1c230 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1c240 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
1c250 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
1c260 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
1c270 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
1c280 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
1c290 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
1c2a0 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
1c2b0 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
1c2c0 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
1c2d0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1c2e0 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
1c2f0 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
1c300 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
1c310 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1c320 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1c330 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
1c340 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
1c350 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1c360 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
1c370 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
1c380 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
1c390 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1c3a0 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
1c3b0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
1c3c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1c3d0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1c3e0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
1c3f0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
1c400 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20  aData );..  if( 
1c410 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20  NEVER(wrFlag && 
1c420 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  pBt->readOnly) )
1c430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1c440 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1c450 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
1c460 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
1c470 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
1c480 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c490 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 2f  _EMPTY;.  }..  /
1c4a0 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
1c4b0 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
1c4c0 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
1c4d0 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
1c4e0 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
1c4f0 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
1c500 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
1c510 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
1c520 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
1c530 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
1c540 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
1c550 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
1c560 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1c570 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
1c580 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
1c590 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
1c5a0 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75  Cur->wrFlag = (u
1c5b0 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  8)wrFlag;.  pCur
1c5c0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1c5d0 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
1c5e0 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1c5f0 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1c600 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
1c610 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1c620 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
1c630 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1c640 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e  NVALID;.  pCur->
1c650 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b  cachedRowid = 0;
1c660 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c670 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
1c680 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
1c690 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c6c0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1c6d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1c700 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1c710 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1c720 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1c750 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1c760 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1c770 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c780 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1c790 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1c7a0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
1c7b0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
1c7c0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
1c7f0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
1c800 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1c810 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1c820 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
1c830 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
1c840 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
1c850 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
1c860 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c870 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c880 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1c890 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
1c8a0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
1c8b0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
1c8c0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
1c8d0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
1c8e0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
1c8f0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
1c900 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
1c910 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
1c920 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
1c930 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
1c940 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
1c950 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
1c960 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
1c970 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
1c980 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
1c990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1c9a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c9b0 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
1c9c0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
1c9d0 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
1c9e0 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
1c9f0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
1ca00 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
1ca10 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
1ca20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
1ca30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
1ca40 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
1ca50 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
1ca60 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
1ca70 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
1ca80 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
1ca90 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
1caa0 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
1cab0 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
1cac0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
1cad0 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
1cae0 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
1caf0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
1cb00 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
1cb10 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
1cb20 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
1cb30 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
1cb40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1cb50 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
1cb60 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
1cb70 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
1cb80 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
1cb90 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
1cba0 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
1cbb0 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
1cbc0 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
1cbd0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1cbe0 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
1cbf0 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
1cc00 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
1cc10 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
1cc20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
1cc30 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
1cc40 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
1cc50 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
1cc60 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
1cc70 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
1cc80 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
1cc90 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1cca0 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
1ccb0 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
1ccc0 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
1ccd0 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
1cce0 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
1ccf0 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
1cd00 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
1cd10 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
1cd20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
1cd30 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
1cd40 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
1cd50 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
1cd60 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
1cd70 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
1cd80 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
1cd90 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
1cda0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1cdb0 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
1cdc0 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
1cdd0 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
1cde0 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
1cdf0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
1ce00 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1ce10 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
1ce20 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
1ce30 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
1ce40 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
1ce50 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1ce60 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1ce70 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
1ce80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
1ce90 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
1cea0 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
1ceb0 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
1cec0 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
1ced0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1cee0 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
1cef0 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
1cf00 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
1cf10 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
1cf20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
1cf30 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1cf40 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
1cf50 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
1cf60 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
1cf70 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
1cf80 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
1cf90 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
1cfa0 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
1cfb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1cfc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
1cfd0 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
1cfe0 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1cff0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1d000 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
1d010 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
1d020 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
1d030 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
1d040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d050 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
1d060 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
1d070 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
1d080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d090 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
1d0a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d0b0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1d0c0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1d0d0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1d0e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1d0f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1d100 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
1d110 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d120 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
1d130 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1d140 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
1d150 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
1d160 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1d170 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
1d180 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1d190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
1d1a0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1d1b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1d1c0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
1d1d0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
1d1e0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1d1f0 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
1d200 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1d210 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1d220 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1d230 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1d240 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1d250 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1d260 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1d270 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
1d280 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
1d290 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1d2a0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
1d2b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d2c0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1d2d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1d2e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1d2f0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1d300 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1d310 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1d320 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1d330 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1d340 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1d350 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1d360 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
1d370 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1d380 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1d390 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1d3a0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1d3b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1d3c0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1d3d0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1d3e0 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1d3f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1d400 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
1d410 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1d420 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1d430 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1d440 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1d450 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1d460 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1d470 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1d480 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1d490 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1d4a0 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1d4b0 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1d4c0 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1d4d0 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1d4e0 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1d4f0 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1d500 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1d510 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1d520 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1d530 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1d540 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
1d550 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
1d560 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
1d570 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
1d580 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
1d590 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
1d5a0 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
1d5b0 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
1d5c0 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
1d5d0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
1d5e0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1d5f0 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
1d600 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
1d610 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1d620 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
1d630 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
1d640 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
1d650 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1d660 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1d670 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1d680 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1d690 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1d6a0 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1d6b0 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1d6c0 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1d6d0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1d6e0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1d6f0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1d700 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1d710 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1d720 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1d730 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1d740 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1d750 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1d760 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1d770 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1d780 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1d790 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1d7a0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1d7b0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1d7c0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1d7d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1d7e0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1d7f0 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1d800 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
1d810 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
1d820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d830 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1d840 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1d850 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1d860 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1d870 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1d880 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1d890 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1d8a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1d8b0 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1d8c0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1d910 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1d920 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1d960 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1d970 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1d9b0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1d9c0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1d9d0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1d9e0 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1d9f0 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61  ; \.    pCur->va
1da00 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1daa0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1daf0 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1db00 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1db10 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1db20 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1db30 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1db40 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1db50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1db60 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1db70 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1db80 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1db90 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1dba0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1dbb0 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1dbc0 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1dbd0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1dbe0 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1dbf0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1dc00 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1dc10 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1dc20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1dc30 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1dc40 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1dc50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1dc60 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1dc70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
1dc80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
1dc90 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
1dca0 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1dcb0 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1dcc0 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1dcd0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1dce0 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1dcf0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1dd00 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1dd10 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1dd20 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1dd30 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1dd40 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1dd50 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1dd60 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1dd70 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1dd80 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1dd90 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1dda0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ddb0 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1ddc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1ddd0 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
1dde0 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
1ddf0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1de00 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
1de10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1de20 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
1de30 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1de40 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
1de50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1de60 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
1de70 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
1de80 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1de90 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1dea0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1deb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1dec0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
1ded0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
1dee0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1def0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1df00 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
1df10 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
1df20 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1df30 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1df40 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
1df50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1df60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1df70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1df80 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1df90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1dfa0 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1dfb0 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1dfc0 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1dfd0 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
1dfe0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1dff0 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
1e000 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
1e010 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
1e020 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
1e030 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
1e040 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
1e050 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
1e060 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
1e070 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1e080 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
1e090 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
1e0a0 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
1e0b0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1e0c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1e0d0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1e0e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
1e0f0 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
1e100 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
1e110 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
1e120 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
1e130 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
1e140 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
1e150 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
1e160 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
1e170 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e180 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1e190 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1e1a0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1e1b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1e1c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1e1d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e1e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e1f0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1e200 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
1e210 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
1e220 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ata;.  return SQ
1e230 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e240 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1e250 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1e260 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1e270 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1e280 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1e290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1e2a0 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1e2b0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1e2c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1e2d0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1e2e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1e2f0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1e300 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1e310 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1e320 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1e330 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1e340 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1e350 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1e360 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1e370 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1e380 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1e390 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1e3a0 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1e3b0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1e3c0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1e3d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1e3e0 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1e3f0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1e400 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1e410 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1e420 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1e430 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1e440 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1e450 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1e460 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1e470 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1e480 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1e490 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1e4a0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1e4b0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1e4c0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1e4d0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1e4e0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1e4f0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1e500 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1e510 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1e520 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1e530 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1e540 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1e550 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1e560 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1e570 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1e580 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1e590 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1e5a0 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1e5b0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1e5c0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1e5d0 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1e5e0 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1e5f0 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1e600 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1e610 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1e620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e640 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1e670 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1e680 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1e690 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1e6a0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1e6b0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1e6c0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1e6d0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1e6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1e6f0 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1e700 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1e710 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1e720 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1e730 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1e740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1e750 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e760 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1e770 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1e780 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1e790 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e7a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e7b0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1e7c0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1e7d0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1e7e0 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1e7f0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1e800 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1e810 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1e820 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1e830 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1e840 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1e850 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1e860 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1e870 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1e880 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1e890 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1e8a0 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1e8b0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1e8c0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1e8d0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1e8e0 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1e8f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1e900 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1e910 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1e920 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1e930 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1e940 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1e950 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1e960 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1e970 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e980 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1e990 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1e9a0 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
1e9b0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1e9c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1e9d0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1e9e0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1e9f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1ea00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ea10 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1ea20 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1ea30 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1ea40 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1ea50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ea60 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1ea70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1ea80 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
1ea90 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
1eaa0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
1eab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1eac0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1ead0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
1eae0 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  vfl, &pPage, 0);
1eaf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
1eb00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1eb10 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
1eb20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1eb30 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
1eb40 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1eb50 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
1eb60 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
1eb70 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
1eb80 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
1eb90 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
1eba0 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
1ebb0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1ebc0 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
1ebd0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
1ebe0 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
1ebf0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
1ec00 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1ec10 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
1ec20 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
1ec30 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
1ec40 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
1ec50 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
1ec60 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
1ec70 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
1ec80 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
1ec90 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
1eca0 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
1ecb0 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
1ecc0 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
1ecd0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1ece0 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
1ecf0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
1ed00 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
1ed10 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1ed20 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
1ed30 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
1ed40 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
1ed50 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
1ed60 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
1ed70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
1ed80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ed90 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
1eda0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
1edb0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1edc0 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
1edd0 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
1ede0 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
1edf0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1ee00 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
1ee10 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1ee20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1ee30 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
1ee40 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ee60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1ee70 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
1ee80 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
1ee90 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
1eea0 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
1eeb0 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
1eec0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
1eed0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
1eee0 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
1eef0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
1ef00 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
1ef10 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1ef20 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
1ef30 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
1ef40 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
1ef50 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
1ef60 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
1ef70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ef80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ef90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1efa0 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
1efb0 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
1efc0 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
1efd0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1efe0 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
1eff0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
1f000 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
1f010 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
1f020 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
1f030 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f040 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1f050 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1f060 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
1f070 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
1f080 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1f090 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
1f0a0 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
1f0b0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1f0c0 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
1f0d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
1f0e0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
1f0f0 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
1f100 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
1f110 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
1f120 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
1f130 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
1f140 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
1f150 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
1f160 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
1f170 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
1f180 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
1f190 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
1f1a0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
1f1b0 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
1f1c0 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
1f1d0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
1f1e0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
1f1f0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
1f200 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1f210 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
1f220 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
1f230 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
1f240 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
1f250 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
1f260 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1f270 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
1f280 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
1f290 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
1f2a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
1f2b0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
1f2c0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
1f2d0 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
1f2e0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
1f2f0 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
1f300 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
1f310 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
1f320 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1f330 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
1f340 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
1f350 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
1f360 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
1f370 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
1f380 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
1f390 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
1f3a0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1f3b0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1f3c0 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
1f3d0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1f3e0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
1f3f0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
1f400 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
1f410 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
1f420 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
1f430 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
1f440 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1f450 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
1f460 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
1f470 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
1f480 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
1f490 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1f4a0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
1f4b0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
1f4c0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
1f4d0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
1f4e0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
1f4f0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
1f500 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
1f510 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
1f520 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
1f530 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
1f540 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
1f550 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1f560 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1f570 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1f580 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1f590 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
1f5a0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
1f5b0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
1f5c0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
1f5d0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f5f0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
1f600 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
1f610 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
1f620 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
1f630 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
1f640 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f660 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
1f670 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
1f680 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
1f690 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1f6a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1f6b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
1f6c0 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
1f6d0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1f6e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1f6f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f700 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
1f710 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
1f720 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
1f730 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1f740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f750 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
1f760 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
1f770 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
1f780 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
1f790 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1f7a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1f7b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f7c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1f7d0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1f7e0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
1f7f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f800 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
1f810 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f820 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1f830 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
1f840 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1f850 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
1f860 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
1f870 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1f880 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e  .nKey);..  if( N
1f890 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20  EVER(offset+amt 
1f8a0 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
1f8b0 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20  o.nData) .   || 
1f8c0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1f8d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
1f8e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
1f8f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
1f900 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
1f910 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1f920 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
1f930 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
1f940 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
1f950 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f960 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1f970 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
1f980 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
1f990 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
1f9a0 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
1f9b0 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
1f9c0 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
1f9d0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
1f9e0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1f9f0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
1fa00 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
1fa10 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
1fa20 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1fa30 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
1fa40 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1fa50 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1fa60 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
1fa70 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
1fa80 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
1fa90 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
1faa0 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
1fab0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1fac0 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
1fad0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
1fae0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1faf0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1fb00 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
1fb10 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
1fb20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
1fb30 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
1fb40 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
1fb50 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
1fb60 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
1fb70 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1fb80 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1fb90 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
1fba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fbb0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
1fbc0 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
1fbd0 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1fbe0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
1fbf0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1fc00 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
1fc10 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1fc20 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
1fc30 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
1fc40 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
1fc50 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
1fc60 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
1fc70 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1fc80 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
1fc90 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1fca0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
1fcb0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
1fcc0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
1fcd0 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
1fce0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
1fcf0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
1fd00 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
1fd10 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
1fd20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
1fd30 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
1fd40 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
1fd50 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
1fd60 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
1fd70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1fd80 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
1fd90 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
1fda0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
1fdb0 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
1fdc0 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
1fdd0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
1fde0 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
1fdf0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1fe00 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
1fe10 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a  nOvfl);.      /*
1fe20 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73   nOvfl is always
1fe30 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69   positive.  If i
1fe40 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74  t were zero, fet
1fe50 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20  chPayload would 
1fe60 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  have.      ** be
1fe70 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  en used instead 
1fe80 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
1fe90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
1fea0 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21  WAYS(nOvfl) && !
1feb0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1fec0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1fed0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1fee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fef0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
1ff00 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1ff10 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1ff20 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
1ff30 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
1ff40 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
1ff50 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
1ff60 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
1ff70 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
1ff80 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
1ff90 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1ffa0 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1ffb0 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
1ffc0 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
1ffd0 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
1ffe0 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
1fff0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
20000 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
20010 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
20020 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
20030 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
20040 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
20050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20060 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
20070 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
20080 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20090 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
200a0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
200b0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
200c0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
200d0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
200e0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
200f0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
20100 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
20110 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
20120 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20130 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
20140 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
20150 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
20160 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
20170 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
20180 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
20190 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
201a0 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
201b0 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
201c0 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
201d0 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
201e0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
201f0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
20200 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
20210 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
20220 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
20230 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
20240 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
20250 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
20260 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
20270 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
20280 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
20290 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
202a0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
202b0 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
202c0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
202d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
202e0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
202f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
20300 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
20310 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20320 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
20330 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
20340 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20350 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
20360 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
20370 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
20380 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
20390 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
203a0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
203b0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
203c0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
203d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
203e0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
203f0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
20400 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
20410 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
20420 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
20430 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
20440 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
20450 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
20460 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
20470 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
20480 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  bPage;.        i
20490 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
204a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
204b0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
204c0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
204d0 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
204e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
204f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20500 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
20510 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
20520 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
20530 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
20540 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
20550 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
20560 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
20570 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
20580 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
20590 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
205a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
205b0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
205c0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
205d0 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
205e0 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
205f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
20600 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
20610 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
20620 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
20630 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
20640 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66  ;.          pBuf
20650 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d   += a;.        }
20660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20670 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
20680 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
20690 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
206a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
206b0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
206c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
206d0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
206e0 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
206f0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
20700 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
20710 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
20720 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
20730 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
20740 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
20750 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
20760 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20770 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
20780 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
20790 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
207a0 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
207b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
207c0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
207d0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
207e0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
207f0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
20800 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
20810 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
20820 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
20830 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
20840 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
20850 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20860 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
20870 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
20880 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
20890 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
208a0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
208b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
208c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
208d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
208e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
208f0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
20900 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20910 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
20920 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
20930 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
20940 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20950 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
20960 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
20970 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
20980 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
20990 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
209a0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
209b0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
209c0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
209d0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
209e0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
209f0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
20a00 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
20a10 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
20a20 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
20a30 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
20a40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
20a50 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
20a60 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
20a70 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
20a80 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
20a90 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
20aa0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
20ab0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
20ac0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
20ad0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
20ae0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
20af0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
20b00 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
20b10 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
20b20 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
20b30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20b40 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
20b50 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
20b60 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
20b70 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
20b80 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
20b90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
20ba0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20bb0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20bc0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
20bd0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
20be0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20bf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
20c00 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20c10 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20c20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20c30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
20c40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20c50 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
20c60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20c70 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20c80 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
20c90 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
20ca0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
20cb0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
20cc0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
20cd0 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
20ce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20cf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
20d00 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
20d10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
20d20 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
20d30 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
20d40 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
20d50 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
20d60 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
20d70 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
20d80 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
20d90 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
20da0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
20db0 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
20dc0 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
20dd0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
20de0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
20df0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
20e00 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
20e10 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
20e20 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
20e30 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
20e40 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
20e50 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
20e60 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
20e70 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
20e80 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
20e90 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
20ea0 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
20eb0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
20ec0 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
20ed0 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
20ee0 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
20ef0 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
20f00 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
20f10 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
20f20 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
20f30 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
20f40 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
20f50 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
20f60 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
20f70 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
20f80 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
20f90 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
20fa0 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
20fb0 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
20fc0 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
20fd0 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
20fe0 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
20ff0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
21000 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
21010 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
21020 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
21030 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
21040 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
21050 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
21060 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
21070 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
21080 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
21090 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
210a0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
210b0 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68  gned char *fetch
210c0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
210d0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
210e0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
210f0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
21100 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
21110 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20  t *pAmt,        
21120 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
21130 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
21140 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
21150 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20  /.  int skipKey 
21160 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64           /* read
21170 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61   beginning at da
21180 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
21190 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
211a0 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
211b0 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad;.  MemPage *p
211c0 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Page;.  u32 nKey
211d0 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a  ;.  u32 nLocal;.
211e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
211f0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
21200 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
21210 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21220 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
21230 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21240 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
21250 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21260 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21270 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
21280 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21290 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
212a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
212b0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
212c0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45  Cell );.  if( NE
212d0 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  VER(pCur->info.n
212e0 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Size==0) ){.    
212f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
21300 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21310 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  ->iPage], pCur->
21320 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21330 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
21340 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e         &pCur->in
21350 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c  fo);.  }.  aPayl
21360 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
21370 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
21380 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
21390 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
213a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
213b0 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
213c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
213d0 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
213e0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
213f0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
21400 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
21410 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
21420 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
21430 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
21440 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
21450 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
21460 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  al;.    assert( 
21470 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a  nLocal<=nKey );.
21480 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c    }.  *pAmt = nL
21490 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  ocal;.  return a
214a0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
214b0 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
214c0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
214d0 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
214e0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
214f0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
21500 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
21510 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
21520 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
21530 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
21540 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
21550 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
21560 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
21570 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
21580 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
21590 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
215a0 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
215b0 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
215c0 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
215d0 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
215e0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
215f0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
21600 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
21610 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
21620 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
21630 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
21640 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
21650 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
21660 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
21670 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
21680 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
21690 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
216a0 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
216b0 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
216c0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
216d0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
216e0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
216f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
21700 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
21710 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
21720 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
21730 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
21740 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21750 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
21760 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
21770 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
21780 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21790 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
217a0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
217b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
217c0 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
217d0 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
217e0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
217f0 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
21800 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63  .  return p;.}.c
21810 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
21820 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
21830 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
21840 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
21850 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
21860 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21870 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
21880 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
21890 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
218a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
218b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
218c0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
218d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
218e0 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
218f0 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
21900 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
21910 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
21920 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
21930 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
21940 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
21950 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
21960 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
21970 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
21980 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
21990 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
219a0 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
219b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
219c0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
219d0 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
219e0 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
219f0 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
21a00 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
21a10 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
21a20 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
21a30 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
21a40 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
21a50 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
21a60 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
21a70 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
21a80 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
21a90 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
21aa0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
21ab0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
21ac0 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
21ad0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
21ae0 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
21af0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
21b00 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
21b10 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
21b20 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
21b30 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21b40 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
21b50 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21b60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21b70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21b80 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
21b90 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66  AX_DEPTH );.  if
21ba0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
21bb0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
21bc0 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
21bd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21be0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
21bf0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
21c00 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
21c10 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69   &pNewPage);.  i
21c20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
21c30 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
21c40 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
21c50 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
21c60 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
21c70 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
21c80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
21c90 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
21ca0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
21cb0 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
21cc0 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d  l<1 || pNewPage-
21cd0 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61  >intKey!=pCur->a
21ce0 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79  pPage[i]->intKey
21cf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
21d00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21d10 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
21d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
21d30 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
21d40 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
21d50 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
21d60 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
21d70 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
21d80 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
21d90 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
21da0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
21db0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
21dc0 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
21dd0 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
21de0 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
21df0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
21e00 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
21e10 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
21e20 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
21e30 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
21e40 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
21e50 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
21e60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
21e70 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
21e80 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
21e90 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
21ea0 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
21eb0 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
21ec0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
21ed0 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
21ee0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
21ef0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
21f00 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
21f10 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
21f20 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
21f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
21f40 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
21f50 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
21f60 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
21f70 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
21f80 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
21f90 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
21fa0 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
21fb0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
21fc0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
21fd0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
21fe0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
21ff0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
22000 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
22010 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
22020 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
22030 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
22040 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
22050 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
22060 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
22070 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
22080 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
22090 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
220a0 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
220b0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
220c0 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
220d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
220e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
220f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22110 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22120 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
22130 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
22140 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
22150 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22160 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
22170 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
22180 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
22190 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
221a0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
221b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
221c0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
221d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
221e0 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
221f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
22200 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22210 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
22220 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
22230 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
22240 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
22250 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
22260 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22270 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
22280 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
22290 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
222a0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
222b0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
222c0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
222d0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
222e0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
222f0 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
22300 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
22310 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
22320 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
22330 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
22340 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
22350 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
22360 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
22370 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
22380 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
22390 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
223a0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
223b0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
223c0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
223d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
223e0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
223f0 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
22400 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
22410 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
22420 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
22430 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
22440 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22450 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
22460 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
22470 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
22480 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
22490 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
224a0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
224b0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
224c0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
224d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
224e0 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
224f0 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
22500 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
22510 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
22520 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
22530 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
22540 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
22550 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
22560 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
22570 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
22580 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
22590 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
225a0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
225b0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
225c0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
225d0 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
225e0 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
225f0 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
22600 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
22610 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
22620 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
22630 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
22640 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
22650 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
22660 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
22670 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
22680 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
22690 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
226a0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
226b0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
226c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
226d0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
226e0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
226f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
22700 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
22710 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22720 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22730 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
22740 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
22750 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
22760 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
22770 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
22780 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
22790 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
227a0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
227b0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
227c0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
227d0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
227e0 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
227f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22800 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
22810 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22820 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
22830 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
22840 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
22850 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
22860 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
22870 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
22880 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
22890 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
228a0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
228b0 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
228c0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
228d0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
228e0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
228f0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
22900 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ge = 0;.  }else{
22910 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
22920 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
22930 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
22940 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b  Cur->apPage[0]);
22950 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22970 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
22980 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
22990 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
229a0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
229b0 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  iPage = 0;..    
229c0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
229d0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
229e0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
229f0 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
22a00 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a  is cursor.    **
22a10 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
22a20 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
22a30 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
22a40 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
22a50 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20  is.    ** NULL, 
22a60 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
22a70 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
22a80 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
22a90 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20  t the case,.    
22aa0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
22ab0 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
22ac0 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  r.  */.    asser
22ad0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
22ae0 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  0]->intKey==1 ||
22af0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
22b00 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
22b10 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b     if( (pCur->pK
22b20 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72  eyInfo==0)!=pCur
22b30 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
22b40 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
22b50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22b60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
22b70 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20   }..  /* Assert 
22b80 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61  that the root pa
22b90 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ge is of the cor
22ba0 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20  rect type. This 
22bb0 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a  must be the.  **
22bc0 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c   case as the cal
22bd0 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
22be0 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74  on that loaded t
22bf0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69  he root-page (ei
22c00 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63  ther.  ** this c
22c10 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75  all or a previou
22c20 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f  s invocation) wo
22c30 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
22c40 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20  d corruption .  
22c50 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70  ** if the assump
22c60 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
22c70 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  ue, and it is no
22c80 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
22c90 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62  he flags .  ** b
22ca0 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e  yte to have been
22cb0 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20   modified while 
22cc0 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68  this cursor is h
22cd0 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
22ce0 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  ce.  ** to the p
22cf0 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74  age.  */.  pRoot
22d00 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
22d10 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
22d20 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
22d30 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61  >pgnoRoot );.  a
22d40 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
22d50 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70  Init && (pCur->p
22d60 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f  KeyInfo==0)==pRo
22d70 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ot->intKey );.. 
22d80 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
22d90 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
22da0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
22db0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
22dc0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
22dd0 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ey = 0;..  if( p
22de0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
22df0 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
22e00 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
22e10 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
22e20 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
22e30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22e40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
22e50 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
22e60 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
22e70 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
22e80 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
22e90 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
22ea0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
22eb0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
22ec0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
22ed0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
22ee0 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
22ef0 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
22f00 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
22f10 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
22f20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22f30 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
22f40 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
22f50 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
22f60 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
22f70 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
22f80 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
22f90 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
22fa0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
22fb0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
22fc0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
22fd0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
22fe0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
22ff0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
23000 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
23010 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
23020 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
23030 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23040 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
23050 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
23060 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23070 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23080 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23090 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
230a0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
230b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
230c0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
230d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
230e0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
230f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23100 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23110 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
23120 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
23130 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
23140 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
23150 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
23160 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
23170 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
23180 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
23190 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
231a0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
231b0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
231c0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
231d0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
231e0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
231f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
23200 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
23210 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
23220 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
23230 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
23240 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
23250 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
23260 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
23270 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
23280 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
23290 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
232a0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
232b0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
232c0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
232d0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
232e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
232f0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
23300 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
23310 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
23320 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
23330 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
23340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23350 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
23360 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23370 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
23380 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23390 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
233a0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
233b0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
233c0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
233d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
233e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
233f0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
23400 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23410 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
23420 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23430 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
23440 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
23450 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
23460 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
23470 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
23480 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23490 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
234a0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
234b0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
234c0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
234d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
234e0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
234f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
23500 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
23510 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
23520 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
23530 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
23540 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
23550 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
23560 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
23570 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
23580 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
23590 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
235a0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
235b0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
235c0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
235d0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
235e0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
235f0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
23600 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
23610 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
23620 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
23630 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
23640 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
23650 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
23660 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23670 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23680 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23690 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
236a0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
236b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
236c0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
236d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
236e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
236f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
23700 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
23710 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
23720 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23730 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
23740 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
23750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
23760 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
23770 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23780 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
23790 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
237a0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
237b0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
237c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
237d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
237e0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
237f0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
23800 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
23810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
23820 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
23830 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
23840 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
23850 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
23860 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
23870 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
23880 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
23890 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
238a0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
238b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
238c0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
238d0 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
238e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
238f0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23900 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23910 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
23920 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
23930 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
23940 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
23950 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
23960 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
23970 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
23980 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
23990 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
239a0 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
239b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
239c0 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
239d0 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
239e0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
239f0 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
23a00 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
23a10 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
23a20 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
23a30 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
23a40 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
23a50 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
23a60 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
23a70 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
23a80 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
23a90 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
23aa0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23ab0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
23ac0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
23ad0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23ae0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
23af0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23b00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23b10 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
23b20 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
23b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23b40 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
23b50 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
23b60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23b70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
23b80 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
23b90 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
23ba0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23bb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23bc0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
23bd0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
23be0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23bf0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23c00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23c10 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
23c20 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
23c30 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
23c40 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
23c50 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
23c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
23c70 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  1:0;.    }.  }. 
23c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23c90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23ca0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
23cb0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
23cc0 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
23cd0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
23ce0 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
23cf0 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
23d00 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
23d10 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
23d20 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
23d30 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
23d40 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
23d50 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
23d60 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
23d70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
23d80 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
23d90 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
23da0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
23db0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
23dc0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
23dd0 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
23de0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
23df0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
23e00 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
23e10 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
23e20 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
23e30 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
23e40 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
23e50 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
23e60 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
23e70 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
23e80 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
23e90 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
23ea0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
23eb0 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
23ec0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
23ed0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
23ee0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
23ef0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
23f00 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
23f10 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
23f20 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
23f30 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
23f40 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
23f50 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
23f60 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
23f70 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
23f80 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
23f90 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
23fa0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
23fb0 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
23fc0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fe0 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
23ff0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
24000 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
24010 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
24020 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
24030 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
24040 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
24050 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
24070 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
24080 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
24090 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
240a0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
240b0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
240c0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
240d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
240e0 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
240f0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
24100 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
24110 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
24120 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
24130 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
24140 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
24150 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
24160 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
24170 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
24180 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
24190 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
241a0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
241b0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
241c0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
241d0 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
241e0 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
241f0 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
24200 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
24210 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
24220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24230 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
24240 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
24250 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
24260 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24270 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24280 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24290 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
242a0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
242b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
242c0 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
242d0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
242e0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
242f0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
24300 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
24310 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
24320 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
24330 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
24340 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
24350 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
24360 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
24370 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
24380 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24390 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
243a0 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26  >validNKey .   &
243b0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
243c0 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
243d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
243e0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
243f0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
24400 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
24410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24420 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
24430 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e  atLast && pCur->
24440 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
24450 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
24460 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
24470 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24480 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20    }.  }..  rc = 
24490 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
244a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
244b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
244c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
244d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
244e0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
244f0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
24500 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
24510 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
24520 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24530 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
24540 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  l>0 || pCur->eSt
24550 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
24560 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
24570 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24580 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
24590 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
245a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
245b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
245c0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
245d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
245e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
245f0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
24600 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
24610 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
24620 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
24630 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20 20 20 20  , upr, idx;.    
24640 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
24650 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
24660 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
24670 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
24680 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20   int c;..    /* 
24690 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
246a0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
246b0 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
246c0 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
246d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
246e0 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
246f0 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
24700 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
24710 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
24720 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
24730 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
24740 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
24750 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
24760 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
24770 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
24780 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
24790 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
247a0 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
247b0 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
247c0 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
247d0 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
247e0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
247f0 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
24800 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
24810 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
24820 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
24830 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
24840 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
24850 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
24860 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
24870 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
24880 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
24890 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
248a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
248b0 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
248c0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
248d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
248e0 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
248f0 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  = upr);.    }els
24900 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
24910 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24920 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20  ] = (u16)(idx = 
24930 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
24940 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
24950 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
24960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
24980 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
24990 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
249a0 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
249b0 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61 69 49 64   idx==pCur->aiId
249c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  x[pCur->iPage] )
249d0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
249e0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
249f0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
24a00 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
24a10 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
24a20 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
24a30 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
24a40 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
24a50 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
24a60 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
24a70 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
24a80 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
24a90 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
24aa0 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
24ab0 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
24ac0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
24ad0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
24ae0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
24af0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
24b00 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
24b10 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
24b20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
24b30 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
24b40 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
24b50 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
24b60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24b70 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
24b80 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
24b90 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
24ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
24bb0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24bc0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
24bd0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
24be0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
24bf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
24c00 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
24c10 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
24c20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
24c30 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
24c40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
24c50 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
24c60 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
24c70 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
24c80 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
24c90 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
24ca0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
24cb0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
24cc0 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
24cd0 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
24ce0 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
24cf0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
24d00 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
24d10 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
24d20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
24d30 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
24d40 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
24d50 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
24d60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
24d70 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
24d80 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
24d90 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
24da0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
24db0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
24dc0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
24dd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24de0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
24df0 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
24e00 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30  ( !(nCell & 0x80
24e10 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67  ) && nCell<=pPag
24e20 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
24e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
24e40 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
24e50 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
24e60 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
24e70 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
24e80 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
24e90 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
24ea0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
24eb0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
24ec0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
24ed0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
24ee0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
24ef0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
24f00 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
24f10 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
24f20 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
24f30 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
24f40 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
24f50 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
24f60 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
24f70 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
24f80 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
24f90 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
24fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
24fb0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
24fc0 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
24fd0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
24fe0 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
24ff0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
25000 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
25010 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
25020 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
25030 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
25040 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
25050 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
25060 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
25070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
25080 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
25090 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
250a0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
250b0 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
250c0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
250d0 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
250e0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
250f0 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
25100 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
25110 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
25120 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
25130 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
25140 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
25150 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
25160 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
25170 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
25180 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
25190 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
251a0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
251b0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
251c0 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
251d0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
251e0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
251f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
25200 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
25210 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
25220 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
25230 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
25240 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
25250 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
25260 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
25270 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
25280 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
25290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
252a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
252b0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
252c0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
252d0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
252e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
252f0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
25300 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
25310 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
25320 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
25330 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
25340 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25350 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
25360 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
25370 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
25380 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
25390 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
253a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
253b0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
253c0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
253d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
253e0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
253f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
25400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25410 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
25420 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
25430 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
25440 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
25450 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
25460 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
25470 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
25480 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
25490 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
254a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
254b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
254c0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
254d0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
254e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
254f0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
25500 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
25510 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
25520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
25530 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
25540 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
25550 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
25560 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25570 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
25580 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
25590 75 31 36 29 28 69 64 78 20 3d 20 28 6c 77 72 2b  u16)(idx = (lwr+
255a0 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
255b0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
255c0 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
255d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
255e0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
255f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
25600 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
25610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
25620 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
25630 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
25640 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
25650 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
25660 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
25670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
25680 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
25690 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
256a0 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
256b0 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
256c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
256d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
256e0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
256f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25700 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
25710 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
25720 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25730 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
25740 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
25750 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
25760 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25770 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
25780 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
25790 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
257a0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
257b0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
257c0 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
257d0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
257e0 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
257f0 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  nish;.  }.moveto
25800 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72  _finish:.  retur
25810 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
25820 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
25830 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
25840 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
25850 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
25860 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
25870 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
25880 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
25890 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
258a0 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
258b0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
258c0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
258d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
258e0 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
258f0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
25900 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
25910 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
25920 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
25930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25940 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
25950 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
25960 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
25970 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
25980 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
25990 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
259a0 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
259b0 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
259c0 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
259d0 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
259e0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
259f0 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
25a00 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
25a10 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
25a20 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
25a30 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
25a40 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
25a50 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
25a60 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
25a70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
25a80 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
25a90 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
25aa0 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
25ab0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
25ac0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
25ad0 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
25ae0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
25af0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
25b00 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
25b10 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
25b20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
25b30 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
25b40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25b50 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
25b60 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
25b70 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
25b80 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
25b90 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25ba0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
25bb0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
25bc0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
25bd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25be0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
25bf0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
25c00 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66   pRes!=0 );.  if
25c10 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
25c20 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
25c30 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
25c40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25c50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
25c60 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
25c70 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
25c80 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
25c90 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
25ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25cb0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
25cc0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70  ipNext = 0;..  p
25cd0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
25ce0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25cf0 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
25d00 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25d10 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
25d20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
25d30 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d  .  assert( idx<=
25d40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
25d50 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
25d60 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
25d70 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
25d80 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
25d90 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
25da0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
25db0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
25dc0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
25dd0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
25de0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
25df0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
25e00 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
25e10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
25e20 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
25e30 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  t(pCur);.      *
25e40 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
25e50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
25e60 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
25e70 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
25e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
25e90 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
25ea0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
25eb0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
25ec0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
25ed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
25ee0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
25ef0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
25f00 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
25f10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25f20 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
25f30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25f40 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
25f50 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
25f60 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
25f70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
25f80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
25f90 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
25fa0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
25fb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
25fc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25fd0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
25fe0 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
25ff0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
26000 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
26010 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
26020 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
26030 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
26040 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
26050 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
26060 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
26070 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
26080 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
26090 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
260a0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
260b0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
260c0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
260d0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
260e0 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
260f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
26100 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
26110 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
26120 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
26130 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
26140 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
26150 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
26160 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
26170 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
26180 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
26190 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
261a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
261b0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
261c0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
261d0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
261e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
261f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26200 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  }.  pCur->atLast
26210 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53   = 0;.  if( CURS
26220 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
26230 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
26240 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
26250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26260 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
26270 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
26280 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
26290 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
262a0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
262b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
262c0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
262d0 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
262e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
262f0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
26300 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
26310 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
26320 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
26330 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
26340 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
26350 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
26360 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
26370 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
26380 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
26390 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
263a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
263b0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
263c0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
263d0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
263e0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
263f0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26400 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
26410 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
26420 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
26430 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
26440 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
26450 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
26460 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
26470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
26480 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
26490 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
264a0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
264b0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
264c0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
264d0 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   0;..    pCur->a
264e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
264f0 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
26500 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26510 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
26520 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
26530 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
26540 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
26550 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
26560 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
26570 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26590 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
265a0 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
265b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
265c0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
265d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
265e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
265f0 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
26600 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
26610 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
26620 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
26630 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
26640 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
26650 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
26660 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
26670 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
26680 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
26690 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
266a0 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
266b0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
266c0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
266d0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
266e0 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
266f0 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
26700 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26710 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
26720 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
26730 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
26740 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
26750 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
26760 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
26770 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
26780 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
26790 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
267a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
267b0 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
267c0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
267d0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
267e0 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
267f0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
26800 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
26810 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
26820 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
26830 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
26840 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
26850 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
26860 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
26870 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
26880 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
26890 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
268a0 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
268b0 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
268c0 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
268d0 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
268e0 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
268f0 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
26900 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
26910 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
26920 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
26930 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
26940 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
26950 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
26960 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
26970 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
26980 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
26990 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
269a0 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
269b0 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
269c0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
269d0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
269e0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
269f0 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
26a00 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
26a10 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
26a20 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
26a30 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
26a40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
26a50 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
26a60 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
26a70 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
26a80 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
26a90 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
26aa0 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
26ab0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
26ac0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
26ad0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
26ae0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
26af0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
26b00 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
26b10 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
26b20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
26b30 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
26b40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
26b50 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
26b60 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
26b70 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
26b80 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
26b90 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
26ba0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
26bb0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
26bc0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
26bd0 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
26be0 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
26bf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26c00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
26c10 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
26c20 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
26c30 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
26c40 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
26c50 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
26c60 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
26c70 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
26c80 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
26c90 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
26ca0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
26cb0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
26cc0 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
26cd0 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
26ce0 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
26cf0 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
26d00 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
26d10 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
26d20 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
26d30 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
26d40 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
26d50 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
26d60 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
26d70 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
26d80 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
26d90 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
26da0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
26db0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
26dc0 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d  act && nearby<=m
26dd0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75  xPage ){.      u
26de0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61  8 eType;.      a
26df0 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
26e00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26e10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26e20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
26e30 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
26e40 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
26e50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
26e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26e70 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
26e80 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
26e90 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
26ea0 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
26eb0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e        *pPgno = n
26ec0 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  earby;.    }.#en
26ed0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
26ee0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
26ef0 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
26f00 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
26f10 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
26f20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
26f30 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
26f40 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
26f50 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
26f60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
26f70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26f80 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
26f90 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
26fa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
26fb0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
26fc0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
26fd0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
26fe0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
26ff0 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
27000 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
27010 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
27020 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
27030 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
27040 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
27050 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
27060 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
27070 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
27080 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
27090 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
270a0 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
270b0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
270c0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
270d0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
270e0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
270f0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
27100 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
27110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27120 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
27130 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
27140 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
27150 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
27160 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
27170 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
27180 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29   iTrunk>mxPage )
27190 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
271a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
271b0 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
271c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
271d0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
271e0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
271f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
27200 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
27210 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
27220 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
27230 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27240 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27250 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
27260 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
27270 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20   /* # of leaves 
27280 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  on this trunk pa
27290 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
272a0 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
272b0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
272c0 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
272d0 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
272e0 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
272f0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
27300 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
27310 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
27320 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
27330 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
27340 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
27350 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
27360 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27370 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
27380 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
27390 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
273a0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
273b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
273c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
273d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
273e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
273f0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
27400 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
27410 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
27420 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
27430 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
27440 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
27450 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
27460 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
27470 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
27480 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
27490 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
274a0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
274b0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
274c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
274d0 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
274e0 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
274f0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
27500 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
27510 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
27520 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
27530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27540 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
27550 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27560 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27570 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27580 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
27590 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
275a0 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
275b0 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
275c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
275d0 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
275e0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
275f0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
27600 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
27610 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
27620 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
27630 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
27640 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27650 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
27660 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
27670 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
27680 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
27690 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
276a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
276b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
276c0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
276d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
276e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
276f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
27700 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
27710 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
27720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
27730 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
27740 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
27750 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
27760 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
27770 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
27780 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27790 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
277a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
277b0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
277c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
277d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
277e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
277f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27800 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27810 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27820 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
27830 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
27840 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
27850 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
27860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27880 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
27890 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
278a0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
278b0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
278c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
278d0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
278e0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
278f0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
27900 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
27910 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
27920 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
27930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27940 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
27950 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
27960 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
27970 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
27980 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
27990 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
279a0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
279b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
279c0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
279d0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
279e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
279f0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
27a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27a10 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
27a20 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
27a30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
27a40 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
27a50 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
27a60 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
27a70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27a80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27a90 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
27aa0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
27ab0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27ac0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27ad0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
27ae0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
27af0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
27b00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27b10 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
27b20 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
27b30 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
27b40 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
27b50 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
27b60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
27b70 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
27b80 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
27b90 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
27ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
27bb0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
27bc0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
27bd0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
27be0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
27bf0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
27c00 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
27c10 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
27c20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
27c30 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
27c40 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
27c50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
27c60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27c70 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
27c80 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
27c90 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
27ca0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
27cb0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
27cc0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
27cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27ce0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27cf0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
27d00 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
27d10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27d20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
27d30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27d40 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27d50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27d60 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
27d70 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
27d80 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
27d90 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
27da0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27db0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
27dc0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
27dd0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
27de0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
27df0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
27e00 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
27e10 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
27e20 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
27e30 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
27e40 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
27e50 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
27e60 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
27e70 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
27e80 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
27e90 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
27ea0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
27eb0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
27ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
27ed0 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2 i;.          i
27ee0 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
27ef0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
27f00 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
27f10 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
27f20 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
27f30 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
27f40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
27f50 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
27f60 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
27f70 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
27f80 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
27f90 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
27fa0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
27fb0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
27fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
27fd0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
27fe0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
27ff0 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
28000 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
28010 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28020 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
28030 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
28040 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
28050 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
28060 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
28070 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28080 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
28090 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
280a0 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
280b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
280c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
280d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
280e0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
280f0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
28100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28110 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
28120 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
28130 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
28140 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
28150 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
28160 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
28170 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
28180 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
28190 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
281a0 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
281b0 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
281d0 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
281e0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
281f0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
28200 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
28210 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
28220 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
28230 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28240 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
28250 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28260 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28270 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
28280 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
28290 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
282a0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
282b0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
282c0 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
282d0 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
282e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
282f0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
28300 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
28310 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
28320 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
28330 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
28340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
28350 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
28360 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
28370 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
28380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
283a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
283b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
283c0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
283d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
283e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
283f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28400 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28410 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
28420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28440 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
28450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28460 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
28470 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
28480 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
28490 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
284a0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
284b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
284c0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
284d0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
284e0 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
284f0 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
28500 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
28510 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
28520 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28530 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
28540 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
28550 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
28560 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
28570 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
28580 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
28590 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
285a0 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
285b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
285c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
285d0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
285e0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
285f0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
28600 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
28610 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
28620 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
28630 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
28640 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
28650 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
28660 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
28670 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
28680 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
28690 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
286a0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
286b0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
286c0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
286d0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
286e0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
286f0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
28700 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
28710 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
28720 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
28730 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
28740 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
28750 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
28760 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
28770 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
28780 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
28790 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
287a0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
287b0 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
287c0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
287d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
287e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
287f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
28800 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
28810 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
28820 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
28830 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
28840 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
28850 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
28860 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
28870 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
28880 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
28890 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
288a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
288b0 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
288c0 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
288d0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
288e0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
288f0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
28900 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
28910 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
28920 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
28930 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
28940 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
28950 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  age, 1);.    if(
28960 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
28970 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
28980 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
28990 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
289a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
289b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
289c0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
289d0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
289e0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
289f0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
28a00 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
28a10 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
28a20 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
28a30 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28a40 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
28a50 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
28a60 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
28a70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
28a80 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
28a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28aa0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
28ab0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
28ac0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
28ad0 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
28ae0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
28af0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
28b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28b10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
28b20 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
28b30 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
28b40 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
28b50 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
28b60 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
28b70 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
28b80 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
28b90 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
28ba0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
28bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
28bc0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
28bd0 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
28be0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28bf0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
28c00 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
28c10 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
28c20 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
28c30 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
28c40 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
28c50 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
28c60 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
28c70 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
28c80 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
28c90 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
28ca0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
28cb0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
28cc0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
28cd0 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
28ce0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
28cf0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
28d00 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
28d10 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
28d20 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
28d30 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
28d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
28d50 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
28d60 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
28d70 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
28d80 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
28d90 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
28da0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
28db0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
28dc0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
28dd0 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
28de0 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
28df0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
28e00 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
28e10 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e30 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
28e40 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
28e50 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e70 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
28e80 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
28e90 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
28ea0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
28eb0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
28ec0 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
28ed0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
28ee0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
28ef0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
28f00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
28f10 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
28f20 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
28f30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
28f60 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
28f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28f90 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
28fa0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
28fb0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
28fc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28fd0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
28fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
28ff0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
29000 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
29010 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
29020 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
29030 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
29040 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
29050 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
29060 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
29070 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
29080 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
29090 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
290a0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
290b0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
290c0 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
290d0 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
290e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
290f0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
29100 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
29110 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
29120 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
29130 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
29140 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
29150 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
29160 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
29170 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
29180 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
29190 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
291a0 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
291b0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
291c0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
291d0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
291e0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
291f0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
29200 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
29210 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
29220 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
29230 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
29240 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
29250 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
29260 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
29270 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
29280 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
29290 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
292a0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
292b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
292c0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
292d0 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
292e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
292f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
29300 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
29310 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
29320 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
29330 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
29340 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
29350 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
29360 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
29370 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
29380 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
29390 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
293a0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
293b0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
293c0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
293d0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
293e0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
293f0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
29400 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
29410 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
29420 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
29430 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
29440 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
29450 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
29460 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
29470 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
29480 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
29490 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
294a0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
294b0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
294c0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
294d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
294e0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
294f0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
29500 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
29510 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
29520 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
29530 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
29540 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
29550 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
29560 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
29570 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
29580 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
29590 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
295a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
295b0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
295c0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
295d0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
295e0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
295f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
29600 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
29610 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
29620 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
29630 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
29640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
29660 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
29670 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
29680 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
29690 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
296a0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
296b0 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
296c0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
296d0 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
296e0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
296f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29700 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29710 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
29720 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
29730 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
29740 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
29750 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
29760 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
29770 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
29780 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
29790 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
297a0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
297b0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
297c0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
297d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
297e0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
297f0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
29800 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
29810 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
29820 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
29830 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
29840 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
29850 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
29860 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
29870 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
29880 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
29890 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
298a0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
298b0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
298c0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
298d0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
298e0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
298f0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
29900 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
29910 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
29920 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
29930 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
29940 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
29950 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
29960 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
29970 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
29980 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
29990 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
299a0 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
299b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
299c0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
299d0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
299e0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
299f0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
29a00 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
29a10 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
29a20 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
29a30 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
29a40 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
29a50 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
29a60 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
29a70 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
29a80 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
29a90 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
29aa0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
29ab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
29ac0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29ad0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
29ae0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
29af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29b00 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
29b10 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
29b20 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
29b30 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
29b40 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
29b50 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
29b60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
29b70 20 70 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e   pPage && !pBt->
29b80 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
29b90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29ba0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
29bb0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
29bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29bd0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
29be0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
29bf0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
29c00 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
29c10 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
29c20 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
29c30 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
29c40 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
29c50 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
29c60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
29c70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
29c80 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
29c90 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
29ca0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
29cb0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
29cc0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
29cd0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
29ce0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
29cf0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
29d00 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
29d10 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
29d20 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
29d30 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
29d40 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
29d50 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
29d60 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
29d70 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
29d80 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
29d90 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
29da0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
29db0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
29dc0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
29dd0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
29de0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
29df0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
29e00 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
29e10 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
29e20 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
29e30 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29e40 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
29e50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29e60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
29e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
29e90 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
29ea0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
29eb0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
29ec0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
29ed0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
29ee0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
29ef0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29f00 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
29f10 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
29f20 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
29f30 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
29f40 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
29f50 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
29f60 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
29f70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
29f80 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
29f90 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
29fa0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
29fb0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
29fc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29fd0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
29fe0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
29ff0 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2a000 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2a010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2a020 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2a030 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2a040 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2a050 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2a060 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2a070 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2a080 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2a090 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
2a0a0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
2a0b0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
2a0c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2a0d0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
2a0e0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2a0f0 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
2a100 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
2a110 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
2a120 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
2a130 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
2a140 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a150 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2a160 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2a170 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
2a180 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2a190 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2a1a0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2a1b0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
2a1c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
2a1d0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
2a1e0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
2a1f0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
2a200 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
2a210 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
2a220 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
2a230 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
2a240 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
2a250 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
2a260 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
2a270 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
2a280 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
2a290 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
2a2a0 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
2a2b0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
2a2c0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
2a2d0 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
2a2e0 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
2a2f0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
2a300 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
2a310 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
2a320 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
2a330 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
2a340 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
2a350 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2a360 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
2a370 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
2a380 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
2a390 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
2a3a0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
2a3b0 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
2a3c0 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
2a3d0 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
2a3e0 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
2a3f0 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
2a400 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2a410 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
2a420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2a430 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2a440 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
2a450 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
2a460 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
2a470 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
2a480 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
2a490 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2a4a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2a4b0 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
2a4c0 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
2a4d0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
2a4e0 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
2a4f0 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
2a500 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2a510 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
2a520 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
2a530 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2a540 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
2a550 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
2a560 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
2a570 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
2a580 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
2a590 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
2a5a0 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
2a5b0 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
2a5c0 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
2a5d0 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
2a5e0 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
2a5f0 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
2a600 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
2a610 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
2a620 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
2a630 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2a640 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
2a650 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
2a660 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
2a670 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
2a680 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
2a690 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
2a6a0 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
2a6b0 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
2a6c0 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
2a6d0 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
2a6e0 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
2a6f0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
2a700 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
2a710 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
2a720 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
2a730 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
2a740 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
2a750 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
2a760 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
2a770 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
2a780 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
2a790 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
2a7a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2a7b0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2a7c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
2a7d0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
2a7e0 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
2a7f0 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
2a800 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
2a810 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
2a820 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2a830 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
2a840 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2a850 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a860 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
2a870 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
2a880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a890 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
2a8a0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
2a8b0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
2a8c0 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
2a8d0 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
2a8e0 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
2a8f0 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
2a900 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
2a910 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
2a920 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
2a930 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
2a940 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
2a950 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
2a960 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
2a970 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
2a980 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
2a990 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
2a9a0 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
2a9b0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
2a9c0 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
2a9d0 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
2a9e0 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
2a9f0 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
2aa00 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
2aa10 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
2aa20 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
2aa30 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
2aa40 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
2aa50 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
2aa60 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
2aa70 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
2aa80 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
2aa90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2aaa0 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
2aab0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
2aac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2aad0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
2aae0 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
2aaf0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2ab00 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
2ab10 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
2ab20 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
2ab30 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2ab40 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2ab50 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
2ab60 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
2ab70 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
2ab80 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
2ab90 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
2aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abb0 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
2abc0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
2abd0 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
2abe0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2ac00 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
2ac10 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2ac20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
2ac30 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
2ac40 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
2ac50 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
2ac60 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
2ac70 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2ac80 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
2ac90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2aca0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
2acb0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
2acc0 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
2acd0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2ace0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
2acf0 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
2ad00 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
2ad10 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
2ad20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2ad30 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2ad40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2ad50 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
2ad60 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
2ad70 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
2ad80 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
2ad90 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
2ada0 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
2adb0 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
2adc0 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
2add0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
2ade0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
2adf0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
2ae00 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
2ae10 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
2ae20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
2ae30 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2ae40 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2ae50 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2ae60 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
2ae70 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
2ae80 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2ae90 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
2aea0 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
2aeb0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
2aec0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
2aed0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
2aee0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
2aef0 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
2af00 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
2af10 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
2af20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2af30 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2af40 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
2af50 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72  Key);.  btreePar
2af60 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2af70 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2af80 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2af90 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
2afa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2afb0 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
2afc0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2afd0 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
2afe0 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
2aff0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2b000 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
2b010 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
2b020 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
2b030 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2b040 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
2b050 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2b060 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
2b070 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
2b080 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78  f( NEVER(nKey>0x
2b090 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
2b0a0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ==0) ){.      re
2b0b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2b0c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2b0d0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
2b0e0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
2b0f0 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
2b100 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
2b110 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
2b120 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
2b130 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
2b140 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
2b150 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
2b160 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
2b170 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
2b180 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
2b190 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
2b1a0 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
2b1b0 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
2b1c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2b1d0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
2b1e0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
2b1f0 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
2b200 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
2b210 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
2b220 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
2b230 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2b240 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
2b250 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
2b260 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
2b270 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
2b280 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2b290 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
2b2a0 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
2b2b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2b2c0 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
2b2d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2b2e0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2b2f0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2b300 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
2b310 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
2b320 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b330 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2b340 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
2b350 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2b360 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
2b370 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
2b380 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
2b390 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
2b3a0 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
2b3b0 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
2b3c0 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
2b3d0 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
2b3e0 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
2b3f0 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
2b400 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
2b410 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
2b420 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
2b430 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
2b440 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
2b450 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2b460 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
2b470 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
2b480 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
2b490 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2b4a0 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
2b4b0 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
2b4c0 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
2b4d0 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
2b4e0 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
2b4f0 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65  the uninitialise
2b500 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
2b510 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
2b520 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
2b530 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
2b540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2b550 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2b560 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
2b570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
2b580 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
2b590 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
2b5a0 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
2b5b0 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
2b5c0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2b5d0 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
2b5e0 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
2b5f0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
2b600 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2b610 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
2b620 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
2b630 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2b640 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2b650 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2b660 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2b670 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2b680 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2b690 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2b6a0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2b6b0 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
2b6c0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
2b6d0 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
2b6e0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2b6f0 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2b700 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2b710 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
2b720 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2b730 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2b740 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2b750 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2b760 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
2b770 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
2b780 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2b790 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2b7a0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2b7b0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
2b7c0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2b7d0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2b7e0 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
2b7f0 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
2b800 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2b810 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2b820 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2b830 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b840 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2b850 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
2b860 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
2b870 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
2b880 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2b890 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
2b8a0 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
2b8b0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
2b8c0 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
2b8d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
2b8e0 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
2b8f0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
2b900 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
2b910 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
2b920 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2b930 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
2b940 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
2b950 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
2b960 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
2b970 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
2b980 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
2b990 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
2b9a0 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
2b9b0 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
2b9c0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
2b9d0 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
2b9e0 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
2b9f0 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
2ba00 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2ba10 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2ba20 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ba30 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2ba40 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2ba50 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
2ba60 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2ba70 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2ba80 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2ba90 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
2baa0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2bab0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2bac0 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
2bad0 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
2bae0 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
2baf0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2bb10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2bb20 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2bb30 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
2bb40 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
2bb50 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
2bb60 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
2bb70 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
2bb80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2bb90 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
2bba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2bbb0 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
2bbc0 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
2bbd0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
2bbe0 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
2bbf0 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
2bc00 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
2bc10 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
2bc20 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
2bc30 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
2bc40 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
2bc50 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
2bc60 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
2bc70 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2bc80 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
2bc90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2bca0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2bcb0 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
2bcc0 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
2bcd0 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
2bce0 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
2bcf0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
2bd00 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
2bd10 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
2bd20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
2bd30 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2bd40 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
2bd50 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
2bd60 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
2bd70 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
2bd80 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
2bd90 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
2bda0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
2bdb0 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
2bdc0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
2bdd0 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
2bde0 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
2bdf0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2be00 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
2be10 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
2be20 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
2be30 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
2be40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
2be50 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
2be60 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2be70 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
2be80 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
2be90 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
2bea0 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
2beb0 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
2bec0 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64  a[] */.  u8 *end
2bed0 50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20  Ptr;     /* End 
2bee0 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
2bef0 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
2bf00 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
2bf10 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
2bf20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
2bf30 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
2bf40 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
2bf50 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
2bf60 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2bf70 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2bf80 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
2bf90 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2bfa0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
2bfb0 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
2bfc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2bfd0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2bfe0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2bff0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
2c000 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2c010 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2c020 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
2c030 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2c040 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61  a;.  ptr = &data
2c050 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
2c060 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70  et + 2*idx];.  p
2c070 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
2c080 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
2c090 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
2c0a0 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
2c0b0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2c0c0 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
2c0d0 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
2c0e0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2c0f0 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28   );.  if( pc < (
2c100 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61  u32)get2byte(&da
2c110 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63  ta[hdr+5]) || pc
2c120 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
2c130 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
2c140 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
2c150 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2c160 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2c170 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
2c180 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
2c190 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2c1a0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2c1b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e  return;.  }.  en
2c1c0 64 50 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61  dPtr = &data[pPa
2c1d0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
2c1e0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
2c1f0 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  - 2];.  assert( 
2c200 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
2c210 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b  NT(ptr)&1)==0 );
2c220 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61    /* ptr is alwa
2c230 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65  ys 2-byte aligne
2c240 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 74  d */.  while( pt
2c250 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20  r<endPtr ){.    
2c260 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75  *(u16*)ptr = *(u
2c270 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20  16*)&ptr[2];.   
2c280 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20   ptr += 2;.  }. 
2c290 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
2c2a0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2c2b0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
2c2c0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
2c2d0 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a  ->nFree += 2;.}.
2c2e0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2c2f0 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
2c300 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
2c310 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
2c320 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
2c330 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
2c340 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2c350 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
2c360 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
2c370 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
2c380 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
2c390 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
2c3a0 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
2c3b0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2c3c0 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
2c3d0 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
2c3e0 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
2c3f0 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
2c400 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
2c410 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f  .** in pPage->aO
2c420 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
2c430 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
2c440 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
2c450 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
2c460 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
2c470 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
2c480 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
2c490 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
2c4a0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
2c4b0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
2c4c0 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
2c4d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2c4e0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
2c4f0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
2c500 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2c510 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
2c520 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
2c530 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
2c540 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
2c550 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
2c560 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
2c570 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
2c580 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
2c590 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
2c5a0 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
2c5b0 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
2c5c0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2c5d0 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
2c5e0 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
2c5f0 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
2c600 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
2c610 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2c620 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
2c630 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
2c640 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
2c650 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
2c660 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
2c670 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
2c680 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
2c690 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
2c6a0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2c6b0 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
2c6c0 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
2c6d0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2c6e0 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
2c6f0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
2c700 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
2c710 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
2c720 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
2c730 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
2c740 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
2c750 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
2c760 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
2c770 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
2c780 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
2c790 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2c7a0 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
2c7b0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
2c7c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
2c7d0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
2c7e0 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
2c7f0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
2c800 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2c810 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
2c820 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2c830 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
2c840 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
2c850 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
2c860 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2c870 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2c880 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
2c890 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
2c8a0 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
2c8b0 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
2c8c0 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  erted */.  int c
2c8d0 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
2c8e0 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
2c8f0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2c900 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2c910 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
2c920 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
2c930 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
2c940 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
2c950 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
2c960 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
2c970 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
2c980 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2c990 65 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f 2a  endPtr;       /*
2c9a0 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
2c9b0 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70   */..  int nSkip
2c9c0 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a   = (iChild ? 4 :
2c9d0 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43   0);..  if( *pRC
2c9e0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
2c9f0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
2ca00 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
2ca10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
2ca20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2ca30 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
2ca40 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
2ca50 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
2ca60 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
2ca70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ca80 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
2ca90 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66  Size(pPage->aOvf
2caa0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
2cab0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2cac0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2cad0 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
2cae0 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
2caf0 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
2cb00 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
2cb10 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
2cb20 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
2cb30 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
2cb40 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
2cb50 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
2cb60 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
2cb70 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
2cb80 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
2cb90 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
2cba0 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
2cbb0 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
2cbc0 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
2cbd0 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
2cbe0 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
2cbf0 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
2cc00 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
2cc10 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
2cc20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
2cc30 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
2cc40 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
2cc50 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2cc60 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d  , pCell) || (sz=
2cc70 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20  =8 && iChild>0) 
2cc80 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
2cc90 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
2cca0 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
2ccb0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
2ccc0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2ccd0 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
2cce0 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
2ccf0 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
2cd00 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
2cd10 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
2cd20 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2cd30 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
2cd40 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
2cd50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
2cd60 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
2cd70 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
2cd80 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
2cd90 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2cda0 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
2cdb0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
2cdc0 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
2cdd0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
2cde0 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d  dx = (u16)i;.  }
2cdf0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
2ce00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ce10 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2ce20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2ce30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ce40 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
2ce50 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2ce60 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2ce70 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ce80 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2ce90 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
2cea0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2ceb0 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ta;.    cellOffs
2cec0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
2ced0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
2cee0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2cef0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
2cf00 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66     ins = cellOff
2cf10 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72  set + 2*i;.    r
2cf20 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  c = allocateSpac
2cf30 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64  e(pPage, sz, &id
2cf40 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  x);.    if( rc )
2cf50 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74  { *pRC = rc; ret
2cf60 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68  urn; }.    /* Th
2cf70 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  e allocateSpace(
2cf80 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e  ) routine guaran
2cf90 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  tees the followi
2cfa0 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65  ng two propertie
2cfb0 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72  s.    ** if it r
2cfc0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a  eturns success *
2cfd0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
2cfe0 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20  x >= end+2 );.  
2cff0 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a    assert( idx+sz
2d000 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
2d010 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2d020 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
2d030 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
2d040 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
2d050 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
2d060 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
2d070 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
2d080 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2d090 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2d0a0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2d0b0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
2d0c0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
2d0d0 74 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b  tr = &data[end];
2d0e0 0a 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26 64  .    endPtr = &d
2d0f0 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73  ata[ins];.    as
2d100 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54  sert( (SQLITE_PT
2d110 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29  R_TO_INT(ptr)&1)
2d120 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69  ==0 );  /* ptr i
2d130 73 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20  s always 2-byte 
2d140 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77  aligned */.    w
2d150 68 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74 72  hile( ptr>endPtr
2d160 20 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36 2a   ){.      *(u16*
2d170 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70  )ptr = *(u16*)&p
2d180 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
2d190 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  r -= 2;.    }.  
2d1a0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2d1b0 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
2d1c0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2d1d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2d1e0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
2d1f0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2d200 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2d210 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2d220 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
2d230 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
2d240 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
2d250 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
2d260 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2d270 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
2d280 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
2d290 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
2d2a0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
2d2b0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
2d2c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
2d2d0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
2d2e0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
2d2f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2d300 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
2d310 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
2d320 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
2d330 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
2d340 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
2d350 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
2d360 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
2d370 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
2d380 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2d390 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
2d3a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2d3b0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2d3c0 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
2d3d0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
2d3e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
2d3f0 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
2d400 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
2d410 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2d420 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2d430 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
2d440 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
2d450 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
2d460 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
2d470 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
2d480 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2d490 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
2d4a0 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
2d4b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2d4c0 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
2d4d0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
2d4e0 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
2d4f0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
2d500 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
2d510 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
2d520 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
2d530 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2d540 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
2d550 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
2d560 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2d570 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
2d580 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
2d590 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
2d5a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
2d5b0 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
2d5c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2d5d0 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
2d5e0 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
2d5f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2d600 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
2d610 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2d620 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2d630 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2d640 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
2d650 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e  =0 && nCell<=(in
2d660 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  t)MX_CELL(pPage-
2d670 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20  >pBt).          
2d680 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c    && (int)MX_CEL
2d690 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
2d6a0 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28  0921);.  assert(
2d6b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2d6c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2d6d0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2d6e0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2d6f0 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
2d700 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
2d710 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
2d720 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2d730 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2d740 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  t( get2byteNotZe
2d750 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
2d760 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
2d770 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61  pCellptr = &data
2d780 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
2d790 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
2d7a0 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61   cellbody = nUsa
2d7b0 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65  ble;.  for(i=nCe
2d7c0 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ll-1; i>=0; i--)
2d7d0 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d 20 61  {.    u16 sz = a
2d7e0 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65  Size[i];.    pCe
2d7f0 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
2d800 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a  cellbody -= sz;.
2d810 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
2d820 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
2d830 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2d840 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
2d850 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  Cell[i], sz);.  
2d860 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
2d870 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
2d880 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
2d890 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c  ata[hdr+5], cell
2d8a0 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
2d8b0 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a  nFree -= (nCell*
2d8c0 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65  2 + nUsable - ce
2d8d0 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2d8e0 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
2d8f0 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
2d900 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
2d910 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
2d920 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
2d930 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
2d940 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
2d950 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2d960 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
2d970 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
2d980 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2d990 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
2d9a0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2d9b0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
2d9c0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2d9d0 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
2d9e0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2d9f0 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
2da00 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
2da10 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
2da20 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
2da30 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2da40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
2da50 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
2da60 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
2da70 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
2da80 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
2da90 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
2daa0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
2dab0 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
2dac0 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
2dad0 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
2dae0 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
2daf0 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
2db00 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
2db10 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
2db20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
2db30 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
2db40 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
2db50 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
2db60 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
2db70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2db80 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2db90 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2dba0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
2dbb0 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
2dbc0 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
2dbd0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
2dbe0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69   balance */...#i
2dbf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2dc00 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
2dc10 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
2dc20 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
2dc30 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
2dc40 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
2dc50 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
2dc60 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
2dc70 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
2dc80 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
2dc90 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
2dca0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
2dcb0 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
2dcc0 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
2dcd0 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
2dce0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
2dcf0 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
2dd00 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e   trying to balan
2dd10 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
2dd20 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
2dd30 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
2dd40 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
2dd50 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
2dd60 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
2dd70 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
2dd80 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
2dd90 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
2dda0 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
2ddb0 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
2ddc0 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
2ddd0 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
2dde0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
2ddf0 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
2de00 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
2de10 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
2de20 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
2de30 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
2de40 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
2de50 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
2de60 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
2de70 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
2de80 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
2de90 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
2dea0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
2deb0 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
2dec0 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
2ded0 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
2dee0 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
2def0 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
2df00 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
2df10 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
2df20 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69   pSpace buffer i
2df30 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
2df40 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79  a temporary copy
2df50 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a   of the divider.
2df60 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c  ** cell that wil
2df70 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
2df80 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68  to pParent. Such
2df90 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
2dfa0 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20   of a 4.** byte 
2dfb0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  page number foll
2dfc0 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62  owed by a variab
2dfd0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2dfe0 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  r. In other.** w
2dff0 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33  ords, at most 13
2e000 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68   bytes. Hence th
2e010 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
2e020 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65  must be at.** le
2e030 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20  ast 13 bytes in 
2e040 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
2e050 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
2e060 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  k(MemPage *pPare
2e070 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  nt, MemPage *pPa
2e080 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b  ge, u8 *pSpace){
2e090 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e  .  BtShared *con
2e0a0 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  st pBt = pPage->
2e0b0 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65  pBt;    /* B-Tre
2e0c0 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e Database */.  
2e0d0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20  MemPage *pNew;  
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0f0 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
2e100 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2e110 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e130 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2e140 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
2e150 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20  pgnoNew;        
2e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e170 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
2e180 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f pNew */..  ass
2e190 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e1a0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2e1b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2e1c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2e1d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2e1e0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2e1f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2e200 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2e210 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  =1 );..  /* This
2e220 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
2e230 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
2e240 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
2e250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2e260 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  /.  if( pPage->n
2e270 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e  Cell<=0 ) return
2e280 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e290 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  BKPT;..  /* Allo
2e2a0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
2e2b0 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   This page will 
2e2c0 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74  become the right
2e2d0 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a  -sibling of .  *
2e2e0 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68  * pPage. Make th
2e2f0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72  e parent page wr
2e300 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20  itable, so that 
2e310 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
2e320 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65  cell.  ** may be
2e330 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f   inserted. If bo
2e340 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  th these operati
2e350 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66  ons are successf
2e360 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a  ul, proceed..  *
2e370 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
2e380 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2e390 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
2e3a0 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72   0, 0);..  if( r
2e3b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e3c0 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20  .    u8 *pOut = 
2e3d0 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20  &pSpace[4];.    
2e3e0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  u8 *pCell = pPag
2e3f0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
2e400 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  l;.    u16 szCel
2e410 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
2e420 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2e430 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
2e440 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2e450 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2e460 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
2e470 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2e480 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2e490 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
2e4a0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
2e4b0 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
2e4c0 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
2e4d0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
2e4e0 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
2e4f0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
2e500 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
2e510 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f  &szCell);..    /
2e520 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2e530 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2e540 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2e550 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20   pointer map.   
2e560 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
2e570 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
2e580 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
2e590 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  er from the .   
2e5a0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
2e5b0 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
2e5c0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74  low page. If eit
2e5d0 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20  her of these.   
2e5e0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66   ** operations f
2e5f0 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e  ails, the return
2e600 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75   code is set, bu
2e610 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  t the contents. 
2e620 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72     ** of the par
2e630 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69  ent page are sti
2e640 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62  ll manipulated b
2e650 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77  y thh code below
2e660 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73  ..    ** That is
2e670 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69   Ok, at this poi
2e680 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nt the parent pa
2e690 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ge is guaranteed
2e6a0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61   to.    ** be ma
2e6b0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52  rked as dirty. R
2e6c0 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
2e6d0 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73  r code will caus
2e6e0 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  e a.    ** rollb
2e6f0 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79  ack, undoing any
2e700 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f   changes made to
2e710 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2e720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e730 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2e740 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
2e750 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
2e760 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2e770 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
2e780 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65  ;.      if( szCe
2e790 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  ll>pNew->minLoca
2e7a0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  l ){.        ptr
2e7b0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
2e7c0 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ew, pCell, &rc);
2e7d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e7e0 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2e7f0 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
2e800 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
2e810 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
2e820 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
2e830 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
2e840 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2e850 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
2e860 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
2e870 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
2e880 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
2e890 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
2e8a0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
2e8b0 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
2e8c0 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
2e8d0 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
2e8e0 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
2e8f0 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
2e900 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
2e910 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
2e920 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
2e930 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
2e940 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
2e950 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
2e960 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
2e970 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
2e980 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2e990 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
2e9a0 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
2e9b0 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
2e9c0 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
2e9d0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2e9e0 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
2e9f0 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
2ea00 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
2ea10 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
2ea20 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
2ea30 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
2ea40 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
2ea50 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
2ea60 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
2ea70 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
2ea80 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
2ea90 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2eaa0 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
2eab0 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
2eac0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2ead0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
2eae0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
2eaf0 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2eb00 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2eb10 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
2eb20 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2eb30 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
2eb40 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2eb50 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
2eb60 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
2eb70 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2eb80 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
2eb90 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
2eba0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
2ebb0 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
2ebc0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
2ebd0 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ent, pParent->nC
2ebe0 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e  ell, pSpace, (in
2ebf0 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c  t)(pOut-pSpace),
2ec00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ec10 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  0, pPage->pgno, 
2ec20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  &rc);..    /* Se
2ec30 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
2ec40 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
2ec50 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
2ec60 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
2ec70 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
2ec80 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2ec90 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2eca0 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
2ecb0 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
2ecc0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
2ecd0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
2ece0 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50   */.    releaseP
2ecf0 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  age(pNew);.  }..
2ed00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2ed10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ed20 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2ed30 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  E */..#if 0./*.*
2ed40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2ed50 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
2ed60 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ute anything to 
2ed70 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
2ed80 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69   SQLite..** it i
2ed90 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69  s sometimes acti
2eda0 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c  vated temporaril
2edb0 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e  y while debuggin
2edc0 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62  g code responsib
2edd0 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69  le .** for setti
2ede0 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ng pointer-map e
2edf0 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
2ee00 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63  c int ptrmapChec
2ee10 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  kPages(MemPage *
2ee20 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61  *apPage, int nPa
2ee30 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ge){.  int i, j;
2ee40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
2ee50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  age; i++){.    P
2ee60 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b  gno n;.    u8 e;
2ee70 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2ee80 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b  age = apPage[i];
2ee90 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
2eea0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2eeb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2eec0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
2eed0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
2eee0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29  age->nCell; j++)
2eef0 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  {.      CellInfo
2ef00 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20   info;.      u8 
2ef10 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  *z;.     .      
2ef20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  z = findCell(pPa
2ef30 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74  ge, j);.      bt
2ef40 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2ef50 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29  pPage, z, &info)
2ef60 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
2ef70 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
2ef80 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
2ef90 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e  = get4byte(&z[in
2efa0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2efb0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
2efc0 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c  t(pBt, ovfl, &e,
2efd0 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2efe0 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2eff0 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2f000 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20  P_OVERFLOW1 );. 
2f010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f020 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2f030 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68  .        Pgno ch
2f040 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a  ild = get4byte(z
2f050 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2f060 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2f070 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2f080 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2f090 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2f0a0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
2f0b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f0c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2f0d0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
2f0e0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2f0f0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2f100 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2f110 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  8]);.      ptrma
2f120 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2f130 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2f140 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2f150 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2f160 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
2f170 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2f180 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
2f190 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f1a0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79   is used to copy
2f1b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2f1c0 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
2f1d0 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70   stored .** on p
2f1e0 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
2f1f0 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70  e pTo. If page p
2f200 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c  From was not a l
2f210 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a  eaf page, then.*
2f220 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
2f230 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  p entries for ea
2f240 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72  ch child page ar
2f250 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  e updated so tha
2f260 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20  t the.** parent 
2f270 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74  page stored in t
2f280 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
2f290 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  s page pTo. If p
2f2a0 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  From contained.*
2f2b0 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68  * any cells with
2f2c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
2f2d0 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68  ointers, then th
2f2e0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2f2f0 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
2f300 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20  ntries are also 
2f310 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
2f320 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2f330 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a  is page pTo..**.
2f340 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63  ** If pFrom is c
2f350 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e  urrently carryin
2f360 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  g any overflow c
2f370 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e  ells (entries in
2f380 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   the.** MemPage.
2f390 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20  aOvfl[] array), 
2f3a0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70  they are not cop
2f3b0 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a  ied to pTo. .**.
2f3c0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
2f3d0 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73  ing, page pTo is
2f3e0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75   reinitialized u
2f3f0 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61  sing btreeInitPa
2f400 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ge()..**.** The 
2f410 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74  performance of t
2f420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f430 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74  not critical. It
2f440 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
2f450 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65   .** the balance
2f460 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64  _shallower() and
2f470 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
2f480 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65  ) procedures, ne
2f490 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63  ither of.** whic
2f4a0 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74  h are called oft
2f4b0 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20  en under normal 
2f4c0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a  circumstances..*
2f4d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
2f4e0 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65  pyNodeContent(Me
2f4f0 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65  mPage *pFrom, Me
2f500 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20  mPage *pTo, int 
2f510 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
2f520 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
2f530 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
2f540 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72   const pBt = pFr
2f550 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20  om->pBt;.    u8 
2f560 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20  * const aFrom = 
2f570 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20  pFrom->aData;.  
2f580 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f    u8 * const aTo
2f590 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20   = pTo->aData;. 
2f5a0 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72     int const iFr
2f5b0 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68  omHdr = pFrom->h
2f5c0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e  drOffset;.    in
2f5d0 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d  t const iToHdr =
2f5e0 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29   ((pTo->pgno==1)
2f5f0 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20   ? 100 : 0);.   
2f600 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
2f610 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20   iData;.  .  .  
2f620 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2f630 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61  >isInit );.    a
2f640 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46  ssert( pFrom->nF
2f650 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20  ree>=iToHdr );. 
2f660 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
2f670 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2f680 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29  Hdr+5]) <= (int)
2f690 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2f6a0 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70  );.  .    /* Cop
2f6b0 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  y the b-tree nod
2f6c0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  e content from p
2f6d0 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
2f6e0 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44  e pTo. */.    iD
2f6f0 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26  ata = get2byte(&
2f700 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2f710 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
2f720 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72  aTo[iData], &aFr
2f730 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e  om[iData], pBt->
2f740 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61  usableSize-iData
2f750 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
2f760 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72  To[iToHdr], &aFr
2f770 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46  om[iFromHdr], pF
2f780 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  rom->cellOffset 
2f790 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c  + 2*pFrom->nCell
2f7a0 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69  );.  .    /* Rei
2f7b0 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70  nitialize page p
2f7c0 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  To so that the c
2f7d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d  ontents of the M
2f7e0 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
2f7f0 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68  .    ** match th
2f800 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20  e new data. The 
2f810 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
2f820 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c  f pTo can actual
2f830 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20  ly fail under.  
2f840 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63    ** fairly obsc
2f850 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65  ure circumstance
2f860 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  s, even though i
2f870 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69  t is a copy of i
2f880 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
2f890 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20  ** page pFrom.. 
2f8a0 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69     */.    pTo->i
2f8b0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72  sInit = 0;.    r
2f8c0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
2f8d0 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20  e(pTo);.    if( 
2f8e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f8f0 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
2f900 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2f910 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2f920 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2f930 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2f940 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2f950 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2f960 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e  es.    ** for an
2f970 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72  y b-tree or over
2f980 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
2f990 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  pTo now contains
2f9a0 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f   the pointers to
2f9b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2f9c0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2f9d0 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65  .      *pRC = se
2f9e0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54  tChildPtrmaps(pT
2f9f0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  o);.    }.  }.}.
2fa00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2fa10 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65  ine redistribute
2fa20 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  s cells on the i
2fa30 50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69  ParentIdx'th chi
2fa40 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a  ld of pParent.**
2fa50 20 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65   (hereafter "the
2fa60 20 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74   page") and up t
2fa70 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20  o 2 siblings so 
2fa80 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68  that all pages h
2fa90 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a  ave about the.**
2faa0 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
2fab0 66 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61  free space. Usua
2fac0 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62  lly a single sib
2fad0 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73  ling on either s
2fae0 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  ide of the.** pa
2faf0 67 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  ge are used in t
2fb00 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  he balancing, th
2fb10 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e  ough both siblin
2fb20 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
2fb30 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69  om one.** side i
2fb40 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68  f the page is th
2fb50 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20  e first or last 
2fb60 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
2fb70 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65  ent. If the page
2fb80 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74   .** has fewer t
2fb90 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28  han 2 siblings (
2fba0 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
2fbb0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2fbc0 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  if the page.** i
2fbd0 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72  s a root page or
2fbe0 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f   a child of a ro
2fbf0 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c  ot page) then al
2fc00 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
2fc10 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70  ings.** particip
2fc20 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
2fc30 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
2fc40 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
2fc50 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d  gs of the page m
2fc60 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
2fc70 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
2fc80 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f  y .** one or two
2fc90 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
2fca0 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
2fcb0 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
2fcc0 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a  over full. .**.*
2fcd0 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
2fce0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2fcf0 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
2fd00 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68   the cells on th
2fd10 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20  e page.** might 
2fd20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
2fd30 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67  stored in MemPag
2fd40 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20  e.aData[]. This 
2fd50 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
2fd60 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
2fd70 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74  rfull. This rout
2fd80 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
2fd90 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63   all cells alloc
2fda0 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70  ated.** to the p
2fdb0 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
2fdc0 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65  ings fit into Me
2fdd0 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65  mPage.aData[] be
2fde0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2fdf0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
2fe00 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
2fe10 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
2fe20 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c  s siblings, cell
2fe30 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65  s may be.** inse
2fe40 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d  rted into or rem
2fe50 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
2fe60 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65  rent page (pPare
2fe70 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a  nt). Doing so.**
2fe80 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70   may cause the p
2fe90 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65  arent page to be
2fea0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
2feb0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74   underfull. If t
2fec0 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20  his.** happens, 
2fed0 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
2fee0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
2fef0 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65  caller to invoke
2ff00 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
2ff10 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  balancing routin
2ff20 65 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72  e to fix this pr
2ff30 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62  oblem (see the b
2ff40 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65  alance() routine
2ff50 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ). .**.** If thi
2ff60 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
2ff70 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
2ff80 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
2ff90 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
2ffa0 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
2ffb0 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20  ate. So if this 
2ffc0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
2ffd0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
2ffe0 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
2fff0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  back..**.** The 
30000 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
30010 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
30020 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20   aOvflSpace, is 
30030 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a  a pointer to a.*
30040 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f  * buffer big eno
30050 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20  ugh to hold one 
30060 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69  page. If while i
30070 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69  nserting cells i
30080 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a  nto the parent.*
30090 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  * page (pParent)
300a0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
300b0 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
300c0 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69  l, this buffer i
300d0 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f  s.** used to sto
300e0 72 65 20 74 68 65 20 70 61 72 65 6e 74 27 73 20  re the parent's 
300f0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
30100 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  Because this fun
30110 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a  ction inserts.**
30120 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f   a maximum of fo
30130 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ur divider cells
30140 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
30150 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d   page, and the m
30160 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f  aximum.** size o
30170 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20  f a cell stored 
30180 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e  within an intern
30190 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  al node is alway
301a0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a  s less than 1/4.
301b0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  ** of the page-s
301c0 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70  ize, the aOvflSp
301d0 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20  ace[] buffer is 
301e0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
301f0 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
30200 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f   for all overflo
30210 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  w cells..**.** I
30220 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20  f aOvflSpace is 
30230 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f  set to a null po
30240 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
30250 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
30260 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
30270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
30280 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
30290 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
302a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
302b0 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
302c0 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
302d0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
302e0 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
302f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30300 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
30310 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
30320 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
30330 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
30340 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
30350 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
30360 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
30370 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
30380 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
30390 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
303a0 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
303b0 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  oot-page */.){. 
303c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
303d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
303e0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
303f0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
30400 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
30410 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30420 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
30430 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
30440 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
30450 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
30460 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
30470 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
30480 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
30490 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
304a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
304b0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
304c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
304d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
304e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
304f0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
30500 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
30510 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
30520 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
30530 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
30540 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
30550 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
30560 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
30570 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
30580 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
30590 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
305a0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
305b0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c   code */.  u16 l
305c0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
305d0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
305e0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
305f0 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
30600 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30620 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
30630 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
30640 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
30650 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30670 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
30680 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
30690 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
306a0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
306b0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
306c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
306d0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
306e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
306f0 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
30700 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
30710 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
30720 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30740 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
30750 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
30760 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
30770 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
30780 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
30790 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
307a0 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
307b0 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
307c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
307d0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
307e0 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
307f0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
30800 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
30810 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
30820 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
30830 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
30840 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
30850 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
30860 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
30870 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
30880 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
30890 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
308a0 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
308b0 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
308c0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
308d0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
308e0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
308f0 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
30900 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
30910 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
30920 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
30930 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
30940 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
30950 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
30960 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
30970 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
30980 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
30990 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
309a0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
309b0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
309c0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
309d0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
309e0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
309f0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
30a00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30a10 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
30a20 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
30a30 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
30a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a50 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
30a60 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
30a70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
30a80 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
30a90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
30aa0 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
30ab0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
30ac0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ae0 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
30af0 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
30b00 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
30b10 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
30b20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30b30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
30b40 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
30b50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
30b60 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
30b70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
30b80 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
30b90 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
30ba0 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
30bb0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
30bc0 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
30bd0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
30be0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
30bf0 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
30c00 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
30c10 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
30c20 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
30c30 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
30c40 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
30c50 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
30c60 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
30c70 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
30c80 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
30c90 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
30ca0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
30cb0 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
30cc0 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
30cd0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
30ce0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
30cf0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
30d00 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
30d10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
30d20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
30d30 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
30d40 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f  0 || pParent->aO
30d50 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72  vfl[0].idx==iPar
30d60 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28  entIdx );..  if(
30d70 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a   !aOvflSpace ){.
30d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30d90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
30da0 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c  /* Find the sibl
30db0 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c  ing pages to bal
30dc0 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74  ance. Also locat
30dd0 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  e the cells in p
30de0 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61  Parent .  ** tha
30df0 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62  t divide the sib
30e00 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70  lings. An attemp
30e10 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
30e20 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
30e30 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69   .  ** either si
30e40 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72  de of pPage. Mor
30e50 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
30e60 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
30e70 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20  de, however, .  
30e80 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ** if there are 
30e90 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
30ea0 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
30eb0 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61  her side. If pPa
30ec0 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
30ed0 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
30ee0 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
30ef0 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
30f00 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a  are taken.  .  *
30f10 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
30f20 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20   also drops the 
30f30 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
30f40 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
30f50 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61  ge. This.  ** wa
30f60 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  y, the remainder
30f70 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
30f80 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
30f90 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a  o deal with any.
30fa0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65    ** overflow ce
30fb0 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  lls in the paren
30fc0 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66  t page, since if
30fd0 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65   any existed the
30fe0 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65  y will.  ** have
30ff0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
31000 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20  moved..  */.  i 
31010 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  = pParent->nOver
31020 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e  flow + pParent->
31030 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32  nCell;.  if( i<2
31040 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
31050 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b  0;.    nOld = i+
31060 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
31070 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66  nOld = 3;.    if
31080 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
31090 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
310a0 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
310b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
310c0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
310d0 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
310e0 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65  = i-2;.    }else
310f0 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
31100 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
31110 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20    }.    i = 2;. 
31120 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69   }.  if( (i+nxDi
31130 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
31140 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e  flow)==pParent->
31150 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69  nCell ){.    pRi
31160 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e  ght = &pParent->
31170 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
31180 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d  drOffset+8];.  }
31190 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74  else{.    pRight
311a0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
311b0 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
311c0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
311d0 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67  ;.  }.  pgno = g
311e0 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b  et4byte(pRight);
311f0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
31200 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
31210 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
31220 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  , &apOld[i]);.  
31230 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31240 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
31250 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
31260 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
31270 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
31280 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
31290 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
312a0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
312b0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
312c0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69  flow;.    if( (i
312d0 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  --)==0 ) break;.
312e0 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76  .    if( i+nxDiv
312f0 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c  ==pParent->aOvfl
31300 5b 30 5d 2e 69 64 78 20 26 26 20 70 50 61 72 65  [0].idx && pPare
31310 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
31320 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
31330 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c  = pParent->aOvfl
31340 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20  [0].pCell;.     
31350 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
31360 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
31370 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
31380 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
31390 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
313a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65     pParent->nOve
313b0 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  rflow = 0;.    }
313c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69  else{.      apDi
313d0 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
313e0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
313f0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
31400 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  low);.      pgno
31410 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
31420 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
31430 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
31440 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
31450 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  iv[i]);..      /
31460 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20  * Drop the cell 
31470 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
31480 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73  page. apDiv[i] s
31490 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20  till points to. 
314a0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c       ** the cell
314b0 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65   within the pare
314c0 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  nt, even though 
314d0 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70  it has been drop
314e0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ped..      ** Th
314f0 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
31500 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65  se dropping a ce
31510 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74  ll only overwrit
31520 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  es the first.   
31530 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
31540 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73   of it, and this
31550 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
31560 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73  ot need the firs
31570 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
31580 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76  bytes of the div
31590 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68  ider cell. So th
315a0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66  e pointer is saf
315b0 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a  e to use.      *
315c0 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20  * later on.  .  
315d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
315e0 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73  Unless SQLite is
315f0 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63   compiled in sec
31600 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e  ure-delete mode.
31610 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20   In this case,. 
31620 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
31630 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
31640 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
31650 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
31660 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
31670 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
31680 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
31690 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
316a0 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
316b0 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
316c0 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
316d0 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
316e0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
316f0 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
31700 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
31710 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
31720 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65  f( pBt->secureDe
31730 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
31740 69 6e 74 20 69 4f 66 66 20 3d 20 53 51 4c 49 54  int iOff = SQLIT
31750 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44  E_PTR_TO_INT(apD
31760 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f  iv[i]) - SQLITE_
31770 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65  PTR_TO_INT(pPare
31780 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
31790 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a      if( (iOff+sz
317a0 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74  New[i])>(int)pBt
317b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
317c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
317d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
317e0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  PT;.          me
317f0 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
31800 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
31810 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20  age*));.        
31820 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
31830 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
31840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31850 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70   memcpy(&aOvflSp
31860 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76  ace[iOff], apDiv
31870 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a  [i], szNew[i]);.
31880 20 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b            apDiv[
31890 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  i] = &aOvflSpace
318a0 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e  [apDiv[i]-pParen
318b0 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20  t->aData];.     
318c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
318d0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
318e0 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
318f0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c  rent->nOverflow,
31900 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b   szNew[i], &rc);
31910 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
31920 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
31930 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
31940 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
31950 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
31960 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
31970 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
31980 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
31990 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
319a0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
319b0 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
319c0 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e    */.  k = pBt->
319d0 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44  pageSize + ROUND
319e0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
319f0 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20  ));.  szScratch 
31a00 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
31a10 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
31a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a30 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
31a40 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
31a50 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
31a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a70 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
31a80 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
31a90 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
31aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ab0 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
31ac0 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64  */.     + k*nOld
31ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31af0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
31b00 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f  pies (apCopy) */
31b10 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
31b20 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
31b30 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
31b40 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
31b50 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
31b60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
31b70 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
31b80 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
31b90 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
31ba0 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
31bb0 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73  Space1 = (u8*)&s
31bc0 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
31bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
31be0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
31bf0 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20  (aSpace1) );..  
31c00 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
31c10 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
31c20 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
31c30 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
31c40 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
31c50 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
31c60 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
31c70 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
31c80 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
31c90 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
31ca0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53  obtained from aS
31cb0 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
31cc0 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
31cd0 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
31ce0 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
31cf0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
31d00 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
31d10 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
31d20 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
31d30 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
31d40 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
31d50 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
31d60 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
31d70 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
31d80 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
31d90 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
31da0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
31db0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
31dc0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
31dd0 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
31de0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
31df0 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
31e00 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
31e10 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
31e20 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
31e30 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
31e40 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
31e50 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
31e60 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
31e70 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
31e80 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
31e90 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
31ea0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
31eb0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
31ec0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
31ed0 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
31ee0 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
31ef0 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
31f00 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
31f10 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
31f20 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
31f30 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61  pOld[0]->hasData
31f40 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
31f50 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
31f60 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20  nt limit;.    . 
31f70 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69     /* Before doi
31f80 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
31f90 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  , take a copy of
31fa0 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e   the i'th origin
31fb0 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  al sibling.    *
31fc0 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
31fd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
31fe0 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74   use data from t
31ff0 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72  he copies rather
32000 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
32010 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
32020 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
32030 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
32040 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
32050 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
32060 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
32070 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
32080 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  ld = apCopy[i] =
32090 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61   (MemPage*)&aSpa
320a0 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
320b0 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65  e + k*i];.    me
320c0 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64  mcpy(pOld, apOld
320d0 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
320e0 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d  age));.    pOld-
320f0 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
32100 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65  &pOld[1];.    me
32110 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61  mcpy(pOld->aData
32120 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
32130 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
32140 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20  );..    limit = 
32150 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
32160 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
32170 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72   if( pOld->nOver
32180 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20  flow>0 ){.      
32190 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
321a0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
321b0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
321c0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
321d0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
321e0 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
321f0 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
32200 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
32210 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
32220 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
32230 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  Cell]);.        
32240 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
32250 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32260 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 4f    u8 *aData = pO
32270 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  ld->aData;.     
32280 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d 20   u16 maskPage = 
32290 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a  pOld->maskPage;.
322a0 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66        u16 cellOf
322b0 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c  fset = pOld->cel
322c0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 66  lOffset;.      f
322d0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
322e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   j++){.        a
322f0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
32300 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
32310 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
32320 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44 61  = findCellv2(aDa
32330 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63 65  ta, maskPage, ce
32340 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20 20  llOffset, j);.  
32350 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
32360 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
32370 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
32380 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  Cell]);.        
32390 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
323a0 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20 20  .    }       .  
323b0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26    if( i<nOld-1 &
323c0 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20  & !leafData){.  
323d0 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31      u16 sz = (u1
323e0 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  6)szNew[i];.    
323f0 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
32400 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
32410 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
32420 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
32430 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54  ] = sz;.      pT
32440 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69  emp = &aSpace1[i
32450 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69  Space1];.      i
32460 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
32470 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
32480 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
32490 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
324a0 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69 6e  ( iSpace1 <= (in
324b0 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  t)pBt->pageSize 
324c0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
324d0 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
324e0 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65   sz);.      apCe
324f0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
32500 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
32510 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32520 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
32530 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74  0 || leafCorrect
32540 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
32550 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
32560 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20  szCell[nCell] - 
32570 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
32580 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
32590 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
325a0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
325b0 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
325c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
325d0 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  ld->hdrOffset==0
325e0 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
325f0 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
32600 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
32610 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
32620 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
32630 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
32640 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
32650 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
32660 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
32670 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d   &pOld->aData[8]
32680 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
32690 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
326a0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
326b0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
326c0 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  if( szCell[nCell
326d0 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ]<4 ){.         
326e0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
326f0 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c   any cells small
32700 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e  er than 4 bytes.
32710 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a   */.          sz
32720 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
32730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32740 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b   }.      nCell++
32750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
32760 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
32770 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
32780 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
32790 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
327a0 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
327b0 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
327c0 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
327d0 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
327e0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
327f0 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
32800 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
32810 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
32820 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
32830 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
32840 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
32850 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
32860 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
32870 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
32880 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
32890 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
328a0 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
328b0 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
328c0 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
328d0 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
328e0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
328f0 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
32900 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
32910 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
32920 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
32930 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
32940 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
32950 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
32960 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
32970 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
32980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
32990 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
329a0 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
329b0 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
329c0 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
329d0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
329e0 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
329f0 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
32a00 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
32a10 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
32a20 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
32a30 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
32a40 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
32a50 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
32a60 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
32a70 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
32a80 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
32a90 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
32aa0 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
32ab0 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
32ac0 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
32ad0 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
32ae0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
32af0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
32b00 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
32b10 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
32b20 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
32b30 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e  +;.      if( k>N
32b40 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49  B+1 ){ rc = SQLI
32b50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
32b60 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
32b70 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20  eanup; }.    }. 
32b80 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
32b90 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
32ba0 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
32bb0 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
32bc0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
32bd0 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
32be0 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
32bf0 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
32c00 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
32c10 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
32c20 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
32c30 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
32c40 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
32c50 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
32c60 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
32c70 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
32c80 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
32c90 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
32ca0 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
32cb0 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
32cc0 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
32cd0 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
32ce0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
32cf0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
32d00 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
32d10 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
32d20 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
32d30 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
32d40 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
32d50 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
32d60 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
32d70 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
32d80 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
32d90 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
32da0 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
32db0 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
32dc0 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
32dd0 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
32de0 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
32df0 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
32e00 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
32e10 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
32e20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
32e30 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
32e40 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
32e50 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
32e60 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
32e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
32e80 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
32e90 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
32ea0 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
32eb0 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
32ec0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
32ed0 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
32ee0 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
32ef0 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
32f00 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
32f10 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
32f20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
32f30 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
32f40 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
32f50 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
32f60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
32f70 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
32f80 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
32f90 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
32fa0 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
32fb0 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
32fc0 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
32fd0 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
32fe0 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
32ff0 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
33000 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
33010 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
33020 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
33030 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
33040 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
33050 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
33060 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
33070 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
33080 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
33090 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
330a0 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73  )>0) or pPage is
330b0 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
330c0 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
330d0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
330e0 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
330f0 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
33100 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
33110 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
33120 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
33130 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
33140 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
33150 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
33160 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
33170 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52  ell==0) );..  TR
33180 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
33190 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
331a0 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
331b0 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
331c0 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
331d0 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
331e0 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
331f0 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
33200 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
33210 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
33220 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
33230 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
33240 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
33250 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
33260 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
33270 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33280 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
33290 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
332a0 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
332b0 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
332c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
332d0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
332e0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
332f0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
33300 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
33310 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
33320 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
33330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33340 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
33350 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
33360 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
33370 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
33380 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
33390 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
333a0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
333b0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
333c0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
333d0 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
333e0 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
333f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
33400 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
33410 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
33420 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
33430 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
33440 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
33450 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
33460 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
33470 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
33480 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
33490 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
334a0 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
334b0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
334c0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
334d0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
334e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
334f0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
33500 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
33510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33520 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
33530 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
33540 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
33550 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
33560 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
33570 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
33580 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  {.    freePage(a
33590 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  pOld[i], &rc);. 
335a0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
335b0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
335c0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
335d0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
335e0 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
335f0 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
33600 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
33610 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
33620 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
33630 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
33640 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
33650 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
33660 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
33670 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
33680 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
33690 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
336a0 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
336b0 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
336c0 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
336d0 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
336e0 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
336f0 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
33700 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
33710 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
33720 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
33730 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
33740 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
33750 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
33760 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
33770 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
33780 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
33790 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
337a0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
337b0 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
337c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
337d0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
337e0 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
337f0 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
33800 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
33810 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
33820 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
33830 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
33840 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
33850 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
33860 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
33870 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
33880 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
33890 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
338a0 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
338b0 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
338c0 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
338d0 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
338e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
338f0 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
33900 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
33910 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
33920 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  [i];.      apNew
33930 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
33940 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  ];.      apNew[m
33950 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
33960 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e  .  }.  TRACE(("n
33970 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
33980 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
33990 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61  %d(%d)\n",.    a
339a0 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73  pNew[0]->pgno, s
339b0 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
339c0 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d  w>=2 ? apNew[1]-
339d0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
339e0 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
339f0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
33a00 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20   apNew[2]->pgno 
33a10 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
33a20 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
33a30 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77   nNew>=4 ? apNew
33a40 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [3]->pgno : 0, n
33a50 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
33a60 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
33a70 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70  =5 ? apNew[4]->p
33a80 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  gno : 0, nNew>=5
33a90 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
33aa0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
33ab0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
33ac0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
33ad0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74  DbPage) );.  put
33ae0 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70  4byte(pRight, ap
33af0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
33b00 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  o);..  /*.  ** E
33b10 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
33b20 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
33b30 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
33b40 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
33b50 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
33b60 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
33b70 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
33b80 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
33b90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
33ba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
33bb0 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
33bc0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
33bd0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
33be0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
33bf0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
33c00 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65  xCells );.    ze
33c10 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
33c20 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73  eFlags);.    ass
33c30 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
33c40 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
33c50 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
33c60 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
33c70 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
33c80 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
33c90 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
33ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
33cb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
33cc0 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  ;..    j = cntNe
33cd0 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
33ce0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
33cf0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
33d00 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
33d10 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
33d20 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
33d30 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
33d40 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
33d50 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
33d60 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31  assert( i<nNew-1
33d70 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a   || j==nCell );.
33d80 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20      if( j<nCell 
33d90 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
33da0 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
33db0 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
33dc0 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
33dd0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
33de0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
33df0 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
33e00 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
33e10 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
33e20 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
33e30 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c  aOvflSpace[iOvfl
33e40 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66  Space];.      if
33e50 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
33e60 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
33e70 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
33e80 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
33e90 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
33ea0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
33eb0 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
33ec0 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
33ed0 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
33ee0 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
33ef0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
33f00 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
33f10 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
33f20 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
33f30 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
33f40 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
33f50 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
33f60 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
33f70 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
33f80 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
33f90 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
33fa0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
33fb0 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
33fc0 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
33fd0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
33fe0 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62    j--;.        b
33ff0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
34000 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
34010 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
34020 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
34030 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20  .        sz = 4 
34040 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  + putVarint(&pCe
34050 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll[4], info.nKey
34060 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
34070 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
34080 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
34090 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
340a0 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
340b0 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
340c0 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
340d0 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
340e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
340f0 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
34100 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
34110 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
34120 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
34130 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
34140 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
34150 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
34160 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
34170 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73  * (see btreePars
34180 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
34190 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
341a0 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
341b0 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
341c0 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
341d0 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
341e0 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
341f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
34200 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
34210 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
34220 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
34230 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
34240 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
34250 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
34260 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
34270 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
34280 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
34290 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
342a0 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
342b0 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
342c0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
342d0 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
342e0 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
342f0 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
34300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34310 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
34320 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
34330 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
34340 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
34350 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
34360 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
34370 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
34380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
34390 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a  vflSpace += sz;.
343a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
343b0 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
343c0 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
343d0 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 20 3c  rt( iOvflSpace <
343e0 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65  = (int)pBt->page
343f0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e  Size );.      in
34400 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
34410 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
34420 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d  sz, pTemp, pNew-
34430 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
34440 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34450 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
34460 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
34470 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
34480 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
34490 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
344a0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a  age) );..      j
344b0 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b  ++;.      nxDiv+
344c0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
344d0 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20  ssert( j==nCell 
344e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c  );.  assert( nOl
344f0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
34500 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28   nNew>0 );.  if(
34510 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54   (pageFlags & PT
34520 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20  F_LEAF)==0 ){.  
34530 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26    u8 *zChild = &
34540 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
34550 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65  aData[8];.    me
34560 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
34570 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a  -1]->aData[8], z
34580 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a  Child, 4);.  }..
34590 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20    if( isRoot && 
345a0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
345b0 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64  0 && pParent->hd
345c0 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30  rOffset<=apNew[0
345d0 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  ]->nFree ){.    
345e0 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
345f0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
34600 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ow contains no c
34610 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73  ells. The only s
34620 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61  ibling.    ** pa
34630 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ge is the right-
34640 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72  child of the par
34650 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f  ent. Copy the co
34660 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
34670 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20    ** child page 
34680 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c  into the parent,
34690 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65 20   decreasing the 
346a0 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f  overall height o
346b0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74  f the.    ** b-t
346c0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62 79  ree structure by
346d0 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65   one. This is de
346e0 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20 22  scribed as the "
346f0 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65  balance-shallowe
34700 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c  r".    ** sub-al
34710 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20  gorithm in some 
34720 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20  documentation.. 
34730 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
34740 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
34750 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
34760 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70   the call to cop
34770 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a  yNodeContent() .
34780 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20      ** sets all 
34790 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
347a0 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
347b0 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d  g to database im
347c0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
347d0 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  * for which the 
347e0 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65  pointer is store
347f0 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e  d within the con
34800 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65  tent being copie
34810 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
34820 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65   The second asse
34830 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  rt below verifie
34840 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c 64  s that the child
34850 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d   page is defragm
34860 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74  ented.    ** (it
34870 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74 20   must be, as it 
34880 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74  was just reconst
34890 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73 73  ructed using ass
348a0 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68  emblePage()). Th
348b0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70  is.    ** is imp
348c0 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70 61  ortant if the pa
348d0 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e  rent page happen
348e0 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f  s to be page 1 o
348f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
34900 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f     ** image.  */
34910 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65  .    assert( nNe
34920 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  w==1 );.    asse
34930 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  rt( apNew[0]->nF
34940 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20  ree == .        
34950 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 77  (get2byte(&apNew
34960 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61  [0]->aData[5])-a
34970 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66  pNew[0]->cellOff
34980 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43  set-apNew[0]->nC
34990 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20  ell*2) .    );. 
349a0 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65     copyNodeConte
349b0 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61  nt(apNew[0], pPa
349c0 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20  rent, &rc);.    
349d0 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30  freePage(apNew[0
349e0 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65  ], &rc);.  }else
349f0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
34a00 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20  M ){.    /* Fix 
34a10 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
34a20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
34a30 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77  the cells that w
34a40 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f 75  ere shifted arou
34a50 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72  nd. .    ** Ther
34a60 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64 69  e are several di
34a70 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
34a80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
34a90 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ries that need t
34aa0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  o.    ** be deal
34ab0 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20 72  t with by this r
34ac0 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20  outine. Some of 
34ad0 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e 20  these have been 
34ae0 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74  set already, but
34af0 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76  .    ** many hav
34b00 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f  e not. The follo
34b10 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72  wing is a summar
34b20 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y:.    **.    **
34b30 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69 65     1) The entrie
34b40 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
34b50 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  h new sibling pa
34b60 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
34b70 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69  t.    **      si
34b80 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73  blings when this
34b90 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
34ba0 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76 65  lled. These have
34bb0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
34bc0 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57       been set. W
34bd0 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
34be0 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20  worry about old 
34bf0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
34c00 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d  re.    **      m
34c10 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
34c20 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65 65  -list - the free
34c30 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73 20  Page() code has 
34c40 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a  taken care.    *
34c50 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e  *      of those.
34c60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
34c70 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d   2) The pointer-
34c80 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
34c90 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
34ca0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20  first overflow. 
34cb0 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20     **      page 
34cc0 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  in any overflow 
34cd0 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e  chains used by n
34ce0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ew divider cells
34cf0 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20  . These .    ** 
34d00 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61       have also a
34d10 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65  lready been take
34d20 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68 65  n care of by the
34d30 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f   insertCell() co
34d40 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
34d50 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73 69  *   3) If the si
34d60 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
34d70 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
34d80 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
34d90 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   of.    **      
34da0 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20  cells stored on 
34db0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
34dc0 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
34dd0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
34de0 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20  .    **   4) If 
34df0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
34e00 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e  s are not intern
34e10 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c  al intkey nodes,
34e20 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a   then any.    **
34e30 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
34e40 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ages used by the
34e50 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65  se cells may nee
34e60 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a  d to be updated.
34e70 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74      **      (int
34e80 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
34e90 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  es never contain
34ea0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65   pointers to ove
34eb0 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20  rflow pages)..  
34ec0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29    **.    **   5)
34ed0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
34ee0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
34ef0 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70  aves, then the p
34f00 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
34f10 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 66  *      entries f
34f20 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  or the right-chi
34f30 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63 68  ld pages of each
34f40 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65   sibling may nee
34f50 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f  d.    **      to
34f60 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
34f70 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73   **.    ** Cases
34f80 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65 61   1 and 2 are dea
34f90 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62 79  lt with above by
34fa0 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65   other code. The
34fb0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
34fc0 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63 61  ck deals with ca
34fd0 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20  ses 3 and 4 and 
34fe0 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68  the one after th
34ff0 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63  at, case 5. Sinc
35000 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  e.    ** setting
35010 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65   a pointer map e
35020 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74 69  ntry is a relati
35030 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f  vely expensive o
35040 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20  peration, this. 
35050 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20     ** code only 
35060 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70  sets pointer map
35070 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69   entries for chi
35080 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ld or overflow p
35090 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
350a0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d     ** actually m
350b0 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61 67  oved between pag
350c0 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  es.  */.    MemP
350d0 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
350e0 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67  w[0];.    MemPag
350f0 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
35100 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76  [0];.    int nOv
35110 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
35120 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e  Overflow;.    in
35130 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c  t iNextOld = pOl
35140 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72  d->nCell + nOver
35150 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f  flow;.    int iO
35160 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72  verflow = (nOver
35170 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76  flow ? pOld->aOv
35180 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b  fl[0].idx : -1);
35190 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20  .    j = 0;     
351a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
351c0 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67  nt 'old' sibling
351d0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d   page */.    k =
351e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
351f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35200 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27  /* Current 'new'
35210 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
35220 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
35230 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
35240 20 20 20 69 6e 74 20 69 73 44 69 76 69 64 65 72     int isDivider
35250 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 0;.      whil
35260 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29  e( i==iNextOld )
35270 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
35280 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
35290 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
352a0 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
352b0 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20  ell on old.     
352c0 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
352d0 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62  ge j. If the sib
352e0 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
352f0 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
35300 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
35310 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
35320 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69 64  ll i was a divid
35330 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  er cell. */.    
35340 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70      pOld = apCop
35350 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  y[++j];.        
35360 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21  iNextOld = i + !
35370 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
35380 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e  >nCell + pOld->n
35390 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
353a0 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65    if( pOld->nOve
353b0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
353c0 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70     nOverflow = p
353d0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
353e0 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
353f0 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  low = i + !leafD
35400 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66  ata + pOld->aOvf
35410 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20  l[0].idx;.      
35420 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69    }.        isDi
35430 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74  vider = !leafDat
35440 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  a;  .      }..  
35450 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
35460 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66  flow>0 || iOverf
35470 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61  low<i );.      a
35480 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
35490 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  2 || pOld->aOvfl
354a0 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61  [0].idx==pOld->a
354b0 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a  Ovfl[1].idx-1);.
354c0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
354d0 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64  erflow<3 || pOld
354e0 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d  ->aOvfl[1].idx==
354f0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69  pOld->aOvfl[2].i
35500 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  dx-1);.      if(
35510 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b   i==iOverflow ){
35520 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64  .        isDivid
35530 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
35540 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77  if( (--nOverflow
35550 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>0 ){.         
35560 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20   iOverflow++;.  
35570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35580 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e  .      if( i==cn
35590 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20  tNew[k] ){.     
355a0 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
355b0 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
355c0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
355d0 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
355e0 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  new.        ** s
355f0 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49  ibling page k. I
35600 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
35610 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
35620 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
35630 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
35640 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73  , then cell i is
35650 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
35660 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
35670 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a  w = apNew[++k];.
35680 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61          if( !lea
35690 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65  fData ) continue
356a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
356b0 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29  assert( j<nOld )
356c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
356d0 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20  k<nNew );..     
356e0 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
356f0 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64  was originally d
35700 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64  ivider cell (and
35710 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a   is not now) or.
35720 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72        ** an over
35730 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66  flow cell, or if
35740 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f   the cell was lo
35750 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65  cated on a diffe
35760 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20  rent sibling.   
35770 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72     ** page befor
35780 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  e the balancing,
35790 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
357a0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73  r map entries as
357b0 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a  sociated.      *
357c0 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64  * with any child
357d0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
357e0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  es need to be up
357f0 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  dated.  */.     
35800 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20 7c   if( isDivider |
35810 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e  | pOld->pgno!=pN
35820 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ew->pgno ){.    
35830 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
35840 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
35850 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
35860 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43  Bt, get4byte(apC
35870 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f  ell[i]), PTRMAP_
35880 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e  BTREE, pNew->pgn
35890 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
358a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
358b0 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d  zCell[i]>pNew->m
358c0 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  inLocal ){.     
358d0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
358e0 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  flPtr(pNew, apCe
358f0 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ll[i], &rc);.   
35900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
35910 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c     }..    if( !l
35920 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b  eafCorrection ){
35930 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
35940 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
35950 20 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20        u32 key = 
35960 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b  get4byte(&apNew[
35970 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  i]->aData[8]);. 
35980 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
35990 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41  (pBt, key, PTRMA
359a0 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69  P_BTREE, apNew[i
359b0 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  ]->pgno, &rc);. 
359c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
359d0 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  f 0.    /* The p
359e0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
359f0 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72  ) contains asser
35a00 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
35a10 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74 0a  hat verify that.
35a20 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74      ** all point
35a30 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72 65  er map pages are
35a40 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
35a50 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20  This is helpful 
35a60 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65  while .    ** de
35a70 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73  bugging. This is
35a80 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65   usually disable
35a90 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72 72  d because a corr
35aa0 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61 79  upt database may
35ab0 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e  .    ** cause an
35ac0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
35ad0 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f  ent to fail.  */
35ae0 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b  .    ptrmapCheck
35af0 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65  Pages(apNew, nNe
35b00 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68  w);.    ptrmapCh
35b10 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e  eckPages(&pParen
35b20 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t, 1);.#endif.  
35b30 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
35b40 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  rent->isInit );.
35b50 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
35b60 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64  E: finished: old
35b70 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
35b80 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
35b90 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43    nOld, nNew, nC
35ba0 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  ell));..  /*.  *
35bb0 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
35bc0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
35bd0 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
35be0 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  :.  sqlite3Scrat
35bf0 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
35c00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
35c10 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
35c20 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
35c30 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
35c40 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
35c50 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
35c60 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
35c70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35c80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
35c90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
35ca0 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  when the root pa
35cb0 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73  ge of a b-tree s
35cc0 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f  tructure is.** o
35cd0 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65  verfull (has one
35ce0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
35cf0 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20  w pages)..**.** 
35d00 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  A new child page
35d10 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
35d20 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
35d30 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
35d40 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c  ot.** page, incl
35d50 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63  uding overflow c
35d60 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64  ells, are copied
35d70 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
35d80 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   The root.** pag
35d90 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72  e is then overwr
35da0 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74  itten to make it
35db0 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
35dc0 69 74 68 20 74 68 65 20 72 69 67 68 74 2d 63 68  ith the right-ch
35dd0 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  ild .** pointer 
35de0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
35df0 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  new page..**.** 
35e00 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
35e10 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  , all pointer-ma
35e20 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
35e30 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73  ponding to pages
35e40 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65   .** that the ne
35e50 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77  w child-page now
35e60 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
35e70 72 73 20 74 6f 20 61 72 65 20 75 70 64 61 74 65  rs to are update
35e80 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20  d. The.** entry 
35e90 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
35ea0 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
35eb0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
35ec0 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
35ed0 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64   is also updated
35ee0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
35ef0 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20  ssful, *ppChild 
35f00 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69  is set to contai
35f10 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
35f20 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70   the child .** p
35f30 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
35f40 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
35f50 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
35f60 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72  caller is requir
35f70 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65  ed.** to call re
35f80 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a  leasePage() on *
35f90 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20  ppChild exactly 
35fa0 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  once. If an erro
35fb0 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20  r occurs,.** an 
35fc0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
35fd0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68  turned and *ppCh
35fe0 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ild is set to 0.
35ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
36000 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65  alance_deeper(Me
36010 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65  mPage *pRoot, Me
36020 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29  mPage **ppChild)
36030 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
36040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36050 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
36060 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
36070 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
36080 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20  ge *pChild = 0; 
36090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
360a0 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68  nter to a new ch
360b0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  ild page */.  Pg
360c0 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
360d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
360e0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
360f0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
36100 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
36110 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42  *pBt = pRoot->pB
36120 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72  t;    /* The BTr
36130 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ee */..  assert(
36140 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
36150 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  w>0 );.  assert(
36160 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
36170 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
36180 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52  );..  /* Make pR
36190 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61  oot, the root pa
361a0 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
361b0 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f  , writable. Allo
361c0 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a  cate a new .  **
361d0 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
361e0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72  become the new r
361f0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
36200 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f  age. Copy the co
36210 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74  ntents.  ** of t
36220 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f  he node stored o
36230 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65  n pRoot into the
36240 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
36250 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
36260 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36270 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
36280 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36290 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
362a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
362b0 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70  e(pBt,&pChild,&p
362c0 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e  gnoChild,pRoot->
362d0 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70  pgno,0);.    cop
362e0 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f  yNodeContent(pRo
362f0 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 29  ot, pChild, &rc)
36300 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  ;.    if( ISAUTO
36310 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
36320 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
36330 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50  gnoChild, PTRMAP
36340 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70  _BTREE, pRoot->p
36350 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
36360 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
36370 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20  .    *ppChild = 
36380 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
36390 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
363a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
363b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
363c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
363d0 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
363e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
363f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36400 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
36410 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
36420 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
36430 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20  l==pRoot->nCell 
36440 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  );..  TRACE(("BA
36450 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74  LANCE: copy root
36460 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20   %d into %d\n", 
36470 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68  pRoot->pgno, pCh
36480 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20  ild->pgno));..  
36490 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72  /* Copy the over
364a0 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20  flow cells from 
364b0 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20  pRoot to pChild 
364c0 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  */.  memcpy(pChi
364d0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74  ld->aOvfl, pRoot
364e0 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e  ->aOvfl, pRoot->
364f0 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
36500 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d  (pRoot->aOvfl[0]
36510 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
36520 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d  verflow = pRoot-
36530 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f  >nOverflow;..  /
36540 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65  * Zero the conte
36550 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68  nts of pRoot. Th
36560 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c  en install pChil
36570 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 63  d as the right-c
36580 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50  hild. */.  zeroP
36590 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c  age(pRoot, pChil
365a0 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50  d->aData[0] & ~P
365b0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34  TF_LEAF);.  put4
365c0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
365d0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
365e0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c  set+8], pgnoChil
365f0 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20  d);..  *ppChild 
36600 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75  = pChild;.  retu
36610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
36620 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
36630 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65 6e  that pCur curren
36640 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  tly points to ha
36650 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69  s just been modi
36660 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20  fied in.** some 
36670 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69  way. This functi
36680 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20 69  on figures out i
36690 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74  f this modificat
366a0 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ion means the.**
366b0 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62   tree needs to b
366c0 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20  e balanced, and 
366d0 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20  if so calls the 
366e0 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
366f0 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e  ncing .** routin
36700 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75  e. Balancing rou
36710 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  tines are:.**.**
36720 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b     balance_quick
36730 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
36740 64 65 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61  deeper().**   ba
36750 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a  lance_nonroot().
36760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
36770 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a  lance(BtCursor *
36780 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  pCur){.  int rc 
36790 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
367a0 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  onst int nMin = 
367b0 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  pCur->pBt->usabl
367c0 65 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20  eSize * 2 / 3;. 
367d0 20 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63   u8 aBalanceQuic
367e0 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38  kSpace[13];.  u8
367f0 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   *pFree = 0;..  
36800 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61  TESTONLY( int ba
36810 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c  lance_quick_call
36820 65 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54  ed = 0 );.  TEST
36830 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63  ONLY( int balanc
36840 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20  e_deeper_called 
36850 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  = 0 );..  do {. 
36860 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
36870 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
36880 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
36890 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50   pCur->apPage[iP
368a0 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69  age];..    if( i
368b0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
368c0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
368d0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
368e0 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
368f0 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
36900 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20  is overfull. In 
36910 74 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74  this case call t
36920 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  he.        ** ba
36930 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66  lance_deeper() f
36940 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  unction to creat
36950 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f  e a new child fo
36960 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  r the root-page.
36970 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
36980 6f 70 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  opy the current 
36990 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
369a0 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e  root-page to it.
369b0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
369c0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
369d0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
369e0 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63  ll balance the c
369f0 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20  hild page..     
36a00 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61     */ .        a
36a10 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f  ssert( (balance_
36a20 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29  deeper_called++)
36a30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
36a40 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  c = balance_deep
36a50 65 72 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d  er(pPage, &pCur-
36a60 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20  >apPage[1]);.   
36a70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36a80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36a90 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
36aa0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
36ab0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
36ac0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  0;.          pCu
36ad0 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b  r->aiIdx[1] = 0;
36ae0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
36af0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
36b00 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  1]->nOverflow );
36b10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36b30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
36b40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
36b50 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
36b60 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
36b70 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20  <=nMin ){.      
36b80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
36b90 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
36ba0 2a 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20  * const pParent 
36bb0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
36bc0 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Page-1];.      i
36bd0 6e 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20  nt const iIdx = 
36be0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
36bf0 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  e-1];..      rc 
36c00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36c10 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ite(pParent->pDb
36c20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
36c30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36c40 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
36c50 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
36c60 43 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  CE.        if( p
36c70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20  Page->hasData.  
36c80 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d         && pPage-
36c90 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20  >nOverflow==1.  
36ca0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d         && pPage-
36cb0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
36cc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  Page->nCell.    
36cd0 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
36ce0 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20  >pgno!=1.       
36cf0 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43    && pParent->nC
36d00 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20  ell==iIdx.      
36d10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
36d20 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71  * Call balance_q
36d30 75 69 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65  uick() to create
36d40 20 61 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f   a new sibling o
36d50 66 20 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68  f pPage on which
36d60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
36d70 20 73 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66   store the overf
36d80 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63  low cell. balanc
36d90 65 5f 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74  e_quick() insert
36da0 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20  s a new cell.   
36db0 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70         ** into p
36dc0 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61  Parent, which ma
36dd0 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20  y cause pParent 
36de0 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69  overflow. If thi
36df0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  s.          ** h
36e00 61 70 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74  appens, the next
36e10 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74   interation of t
36e20 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
36e30 62 61 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20  balance pParent 
36e40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  .          ** us
36e50 65 20 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65  e either balance
36e60 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61  _nonroot() or ba
36e70 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20  lance_deeper(). 
36e80 55 6e 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20  Until this.     
36e90 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c       ** happens,
36ea0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
36eb0 6c 6c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ll is stored in 
36ec0 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63  the aBalanceQuic
36ed0 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20  kSpace[].       
36ee0 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20     ** buffer. . 
36ef0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
36f00 20 20 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72        ** The pur
36f10 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  pose of the foll
36f20 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 69  owing assert() i
36f30 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  s to check that 
36f40 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20  only a.         
36f50 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20   ** single call 
36f60 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  to balance_quick
36f70 28 29 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65  () is made for e
36f80 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
36f90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
36fa0 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
36fb0 77 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65  were not verifie
36fc0 64 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67 20  d, a subtle bug 
36fd0 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a  involving reuse.
36fe0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
36ff0 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63  the aBalanceQuic
37000 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73  kSpace[] might s
37010 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20  neak in..       
37020 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
37030 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65  assert( (balance
37040 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29  _quick_called++)
37050 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
37060 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75   rc = balance_qu
37070 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ick(pParent, pPa
37080 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63  ge, aBalanceQuic
37090 6b 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  kSpace);.       
370a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
370b0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
370c0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
370d0 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  e, call balance_
370e0 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64  nonroot() to red
370f0 69 73 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a  istribute cells.
37100 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74            ** bet
37110 77 65 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75  ween pPage and u
37120 70 20 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69  p to 2 of its si
37130 62 6c 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  bling pages. Thi
37140 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20  s involves.     
37150 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e       ** modifyin
37160 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
37170 66 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  f pParent, which
37180 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
37190 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  nt to.          
371a0 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ** become overfu
371b0 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
371c0 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   The next iterat
371d0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
371e0 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  op.          ** 
371f0 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65  will balance the
37200 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
37210 63 6f 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20  correct this..  
37220 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
37230 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
37240 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f  parent page beco
37250 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68  mes overfull, th
37260 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
37270 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20  or cells.       
37280 20 20 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64     ** are stored
37290 20 69 6e 20 74 68 65 20 70 53 70 61 63 65 20 62   in the pSpace b
372a0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
372b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f  immediately belo
372c0 77 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  w. .          **
372d0 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 69 74   A subsequent it
372e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
372f0 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c  o-loop will deal
37300 20 77 69 74 68 20 74 68 69 73 20 62 79 0a 20 20   with this by.  
37310 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69          ** calli
37320 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ng balance_nonro
37330 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65  ot() (balance_de
37340 65 70 65 72 28 29 20 6d 61 79 20 62 65 20 63 61  eper() may be ca
37350 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20  lled first,.    
37360 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20        ** but it 
37370 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74  doesn't deal wit
37380 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  h overflow cells
37390 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68   - just moves th
373a0 65 6d 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20  em to a.        
373b0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70    ** different p
373c0 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20  age). Once this 
373d0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
373e0 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
373f0 6f 74 28 29 20 0a 20 20 20 20 20 20 20 20 20 20  ot() .          
37400 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64  ** has completed
37410 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  , it is safe to 
37420 72 65 6c 65 61 73 65 20 74 68 65 20 70 53 70 61  release the pSpa
37430 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62  ce buffer used b
37440 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  y.          ** t
37450 68 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c  he previous call
37460 2c 20 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  , as the overflo
37470 77 20 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c  w cell data will
37480 20 68 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20   have been .    
37490 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
374a0 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20  either into the 
374b0 62 6f 64 79 20 6f 66 20 61 20 64 61 74 61 62 61  body of a databa
374c0 73 65 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20  se page or into 
374d0 74 68 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20  the new.        
374e0 20 20 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66    ** pSpace buff
374f0 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  er passed to the
37500 20 6c 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20   latter call to 
37510 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
37520 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
37530 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 70 53            u8 *pS
37540 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
37550 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70  geMalloc(pCur->p
37560 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
37570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
37580 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
37590 61 72 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70  arent, iIdx, pSp
375a0 61 63 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a  ace, iPage==1);.
375b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 46            if( pF
375c0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ree ){.         
375d0 20 20 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69     /* If pFree i
375e0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70  s not NULL, it p
375f0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70  oints to the pSp
37600 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20  ace buffer used 
37610 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
37620 62 79 20 61 20 70 72 65 76 69 6f 75 73 20 63 61  by a previous ca
37630 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
37640 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e  nroot(). Its con
37650 74 65 6e 74 73 20 61 72 65 0a 20 20 20 20 20 20  tents are.      
37660 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f        ** now sto
37670 72 65 64 20 65 69 74 68 65 72 20 6f 6e 20 72 65  red either on re
37680 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
37690 73 20 6f 72 20 77 69 74 68 69 6e 20 74 68 65 20  s or within the 
376a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
376b0 6e 65 77 20 70 53 70 61 63 65 20 62 75 66 66 65  new pSpace buffe
376c0 72 2c 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20  r, so it may be 
376d0 73 61 66 65 6c 79 20 66 72 65 65 64 20 68 65 72  safely freed her
376e0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
376f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
37700 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
37710 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
37720 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65 20 62   /* The pSpace b
37730 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72  uffer will be fr
37740 65 65 64 20 61 66 74 65 72 20 74 68 65 20 6e 65  eed after the ne
37750 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20  xt call to.     
37760 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f       ** balance_
37770 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75  nonroot(), or ju
37780 73 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  st before this f
37790 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
377a0 20 77 68 69 63 68 65 76 65 72 0a 20 20 20 20 20   whichever.     
377b0 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69       ** comes fi
377c0 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  rst. */.        
377d0 20 20 70 46 72 65 65 20 3d 20 70 53 70 61 63 65    pFree = pSpace
377e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
377f0 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
37800 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
37810 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  ..      /* The n
37820 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
37830 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c   the do-loop bal
37840 61 6e 63 65 73 20 74 68 65 20 70 61 72 65 6e 74  ances the parent
37850 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
37860 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
37870 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  e);.      pCur->
37880 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iPage--;.    }. 
37890 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
378a0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
378b0 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71   pFree ){.    sq
378c0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
378d0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
378e0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
378f0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
37900 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54  cord into the BT
37910 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ree.  The key is
37920 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c   given by (pKey,
37930 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65  nKey).** and the
37940 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62   data is given b
37950 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e  y (pData,nData).
37960 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
37970 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20  used only to.** 
37980 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c  define what tabl
37990 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f  e the record sho
379a0 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20  uld be inserted 
379b0 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  into.  The curso
379c0 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
379d0 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
379e0 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  m location..**.*
379f0 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20  * For an INTKEY 
37a00 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20  table, only the 
37a10 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68  nKey value of th
37a20 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20  e key is used.  
37a30 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
37a40 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44  ed.  For a ZEROD
37a50 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70  ATA table, the p
37a60 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61  Data and nData a
37a70 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e  re both ignored.
37a80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
37a90 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
37aa0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
37ab0 74 68 65 6e 20 61 20 73 75 63 63 65 73 73 66 75  then a successfu
37ac0 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76  l call to.** Mov
37ad0 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
37ae0 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75   seek cursor pCu
37af0 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79  r to (pKey, nKey
37b00 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ) has already.**
37b10 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e   been performed.
37b20 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74   seekResult is t
37b30 68 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  he search result
37b40 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67   returned (a neg
37b50 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  ative.** number 
37b60 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  if pCur points a
37b70 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  t an entry that 
37b80 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
37b90 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72  (pKey, nKey), or
37ba0 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76  .** a positive v
37bb0 61 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f 69  alue if pCur poi
37bc0 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79 20 74  nts at an etry t
37bd0 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
37be0 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b  an .** (pKey, nK
37bf0 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ey)). .**.** If 
37c00 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70  the seekResult p
37c10 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
37c20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63  zero, then the c
37c30 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
37c40 20 74 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72 20   that.** cursor 
37c50 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
37c60 20 61 74 20 74 68 65 20 65 78 69 73 74 69 6e 67   at the existing
37c70 20 63 6f 70 79 20 6f 66 20 61 20 72 6f 77 20 74   copy of a row t
37c80 68 61 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20  hat is to be.** 
37c90 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 49 66  overwritten.  If
37ca0 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20   the seekResult 
37cb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
37cc0 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72  then cursor pCur
37cd0 20 6d 61 79 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   may.** point to
37ce0 20 61 6e 79 20 65 6e 74 72 79 20 6f 72 20 74 6f   any entry or to
37cf0 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c   no entry at all
37d00 20 61 6e 64 20 73 6f 20 74 68 69 73 20 66 75 6e   and so this fun
37d10 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65  ction has to see
37d20 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  k.** the cursor 
37d30 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b  before the new k
37d40 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74  ey can be insert
37d50 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
37d60 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20  e3BtreeInsert(. 
37d70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
37d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d90 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
37da0 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
37db0 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
37dc0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
37dd0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
37de0 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74   /* The key of t
37df0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
37e00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
37e10 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
37e20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66    /* The data of
37e30 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
37e40 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
37e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
37e70 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74   extra 0 bytes t
37e80 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
37e90 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
37ea0 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  Bias,           
37eb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
37ec0 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
37ed0 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e  n append */.  in
37ee0 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20  t seekResult    
37ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37f00 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20  Result of prior 
37f10 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
37f20 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   call */.){.  in
37f30 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20  t rc;.  int loc 
37f40 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20  = seekResult;   
37f50 20 20 20 20 20 20 20 2f 2a 20 2d 31 3a 20 62 65         /* -1: be
37f60 66 6f 72 65 20 64 65 73 69 72 65 64 20 6c 6f 63  fore desired loc
37f70 61 74 69 6f 6e 20 20 2b 31 3a 20 61 66 74 65 72  ation  +1: after
37f80 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 20   */.  int szNew 
37f90 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  = 0;.  int idx;.
37fa0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
37fb0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
37fc0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
37fd0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
37fe0 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
37ff0 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
38000 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
38010 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
38020 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
38030 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
38040 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
38050 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
38060 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
38070 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
38080 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61  ipNext;.  }..  a
38090 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
380a0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
380b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
380c0 3e 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e  >wrFlag && pBt->
380d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
380e0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 21 70  RANS_WRITE && !p
380f0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
38100 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
38110 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
38120 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  k(p, pCur->pgnoR
38130 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49  oot, pCur->pKeyI
38140 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20  nfo!=0, 2) );.. 
38150 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
38160 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 62  the caller has b
38170 65 65 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20  een consistent. 
38180 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  If this cursor w
38190 61 73 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 65  as opened.  ** e
381a0 78 70 65 63 74 69 6e 67 20 61 6e 20 69 6e 64 65  xpecting an inde
381b0 78 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 74  x b-tree, then t
381c0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
381d0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 62 6c   be inserting bl
381e0 6f 62 0a 20 20 2a 2a 20 6b 65 79 73 20 77 69 74  ob.  ** keys wit
381f0 68 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20  h no associated 
38200 64 61 74 61 2e 20 49 66 20 74 68 65 20 63 75 72  data. If the cur
38210 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 65  sor was opened e
38220 78 70 65 63 74 69 6e 67 20 61 6e 0a 20 20 2a 2a  xpecting an.  **
38230 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74   intkey table, t
38240 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
38250 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   be inserting in
38260 74 65 67 65 72 20 6b 65 79 73 20 77 69 74 68 20  teger keys with 
38270 61 0a 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61  a.  ** blob of a
38280 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
38290 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
382a0 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
382b0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
382c0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
382d0 20 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   an insert into 
382e0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
382f0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
38300 6e 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75  ncrblob .  ** cu
38310 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
38320 65 20 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c  e row being repl
38330 61 63 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74  aced (assuming t
38340 68 69 73 20 69 73 20 61 20 72 65 70 6c 61 63 65  his is a replace
38350 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
38360 2d 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  - if it is not, 
38370 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
38380 20 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20   a no-op).  */. 
38390 20 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49   if( pCur->pKeyI
383a0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nfo==0 ){.    in
383b0 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
383c0 43 75 72 73 6f 72 73 28 70 2c 20 6e 4b 65 79 2c  Cursors(p, nKey,
383d0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   0);.  }..  /* S
383e0 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
383f0 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
38400 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
38410 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  his table..  **.
38420 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73    ** In some cas
38430 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  es, the call to 
38440 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65  btreeMoveto() be
38450 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  low is a no-op. 
38460 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65  For.  ** example
38470 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  , when inserting
38480 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62