System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b70bf1dc563ec532851715ce51aa1ea0c0c592b9:


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 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
65f0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6600: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6610: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6620: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6630: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6640: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6650: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6660: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
6670: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
6680: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
6690: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
66a0: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
66b0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
66c0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
66d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
66e0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
66f0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
6700: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
6710: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6720: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
6730: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
6740: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
6750: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6770: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6780: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
67a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
67b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
67c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
67d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
67e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
67f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
6800: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
6810: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
6820: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
6830: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
6840: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6850: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
6860: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
6880: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
6890: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
68a0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
68b0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
68c0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
68d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
68e0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
68f0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6900: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6910: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
6920: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6930: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6940: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
6950: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
6960: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
6970: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
6980: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
6990: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
69a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
69b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
69c0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
69d0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
69e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
69f0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6a00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6a10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6a20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
6a30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
6a40: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6a50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6a60: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
6a70: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6a80: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6a90: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
6aa0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
6ab0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
6ac0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
6ad0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
6ae0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
6af0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
6b00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6b10: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b20: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6b30: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6b50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6b60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6b70: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6b80: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6b90: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6ba0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
6bb0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
6bc0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
6bd0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
6be0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
6bf0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6c00: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
6c10: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
6c20: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
6c30: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
6c40: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
6c50: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
6c60: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
6c70: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6c80: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6ca0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6cb0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
6cc0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
6cd0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
6ce0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
6cf0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6d00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6d10: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
6d20: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
6d30: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
6d40: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
6d50: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
6d60: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
6d70: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6d80: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6d90: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6da0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6db0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6dc0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6dd0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
6de0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
6df0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
6e00: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
6e10: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
6e20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6e30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6e40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
6e50: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
6e60: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
6e70: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
6e80: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
6e90: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
6ea0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
6eb0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
6ec0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
6ed0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
6ee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
6ef0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
6f00: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
6f10: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
6f20: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
6f30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
6f40: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
6f50: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
6f60: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
6f70: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
6f80: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
6f90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
6fa0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
6fb0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
6fc0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72  s function.  btr
6fd0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
6fe0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6ff0: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
7000: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
7010: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7020: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
7030: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
7040: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
7050: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
7060: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
7070: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
7080: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
7090: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
70a0: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
70b0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
70c0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
70d0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
70e0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
70f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7100: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7110: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
7120: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7130: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7140: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
7150: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
7160: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7170: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
7180: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
7190: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
71a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
71b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
71c0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
71d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
71e0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
71f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
7200: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
7210: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
7220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7230: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
7240: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
7250: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7260: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7270: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
7280: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
7290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
72a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
72b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
72c0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
72d0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
72e0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
72f0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
7300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7310: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
7320: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7330: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7340: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7350: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
7360: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
7370: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
7380: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7390: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
73a0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
73b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
73c0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
73d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
73e0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
73f0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7400: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7410: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
7420: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
7430: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
7440: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
7450: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
7460: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65  Header = n;.  te
7470: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7480: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7490: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
74a0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
74b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
74c0: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
74d0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
74e0: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
74f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
7500: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
7510: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
7520: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
7530: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
7540: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
7550: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
7560: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
7570: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
7580: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
7590: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
75a0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
75b0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
75c0: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
75d0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
75e0: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
75f0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7600: 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a  0;.    if( (nSiz
7610: 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20  e & ~3)==0 ){.  
7620: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
7630: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
7640: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
7650: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
7660: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
7670: 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  )nSize;.  }else{
7680: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
7690: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
76a0: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
76b0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
76c0: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
76d0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
76e0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
76f0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7700: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7710: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
7720: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
7730: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
7740: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
7750: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
7760: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
7770: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
7780: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7790: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
77a0: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
77b0: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
77c0: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
77d0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
77e0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
77f0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
7800: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
7810: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
7820: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
7830: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
7840: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
7850: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
7860: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
7870: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
7880: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7890: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
78a0: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
78b0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
78c0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
78d0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
78e0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
78f0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7900: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
7910: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
7920: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
7930: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7940: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
7950: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
7960: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
7970: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
7980: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
7990: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
79a0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
79b0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
79c0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
79d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
79e0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
79f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72  1 );.    if( sur
7a00: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
7a10: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
7a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73  >nLocal = (u16)s
7a30: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
7a40: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
7a50: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
7a60: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
7a70: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7a80: 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f  ow = (u16)(pInfo
7a90: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20  ->nLocal + n);. 
7aa0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
7ab0: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
7ac0: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
7ad0: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
7ae0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
7af0: 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61  nfo) \.  btreePa
7b00: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
7b10: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
7b20: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
7b30: 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20  (pInfo)).static 
7b40: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7b50: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
7b60: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7b70: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7b80: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7b90: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
7ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7bb0: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
7bc0: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
7bd0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7bf0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7c00: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
7c10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7c20: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
7c30: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
7c40: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7c50: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
7c60: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
7c70: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
7c80: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
7c90: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
7ca0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
7cb0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7cc0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
7cd0: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
7ce0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
7cf0: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
7d00: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
7d10: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
7d20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
7d30: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
7d40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7d50: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
7d60: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
7d70: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7d80: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
7d90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7da0: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
7db0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7dc0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
7dd0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7de0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
7df0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
7e00: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
7e10: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
7e20: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
7e30: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
7e40: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
7e50: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
7e60: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
7e70: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
7e80: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
7e90: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
7ea0: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
7eb0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
7ec0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
7ed0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7ee0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7ef0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7f00: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
7f10: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
7f20: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
7f30: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7f40: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
7f50: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
7f60: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7f80: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7f90: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7fa0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7fb0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7fc0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7fd0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7fe0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7ff0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
8000: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
8010: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
8020: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
8030: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
8040: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
8050: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
8060: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
8070: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
8080: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
80a0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
80b0: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
80c0: 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  );.  }..  testca
80d0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
80e0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
80f0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8100: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8110: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
8120: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
8130: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  l ){.    int min
8140: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8150: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
8160: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
8170: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
8180: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
8190: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
81a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
81b0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
81c0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
81d0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
81e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
81f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
8200: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
8210: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
8220: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
8230: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
8240: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
8250: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
8260: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
8270: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
8280: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
8290: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
82a0: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
82b0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
82c0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
82d0: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
82e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
82f0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
8300: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8310: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
8320: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
8330: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
8340: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
8350: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
8360: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
8370: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
8380: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
8390: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
83a0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
83b0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
83c0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
83d0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
83e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
83f0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8400: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8410: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8420: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8430: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
8440: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
8450: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
8460: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
8470: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
8480: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
8490: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
84a0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
84b0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
84c0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
84d0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
84e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
84f0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8500: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8510: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8520: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
8530: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
8540: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
8550: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
8560: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
8570: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
8580: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
8590: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
85a0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
85b0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
85c0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
85d0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
85e0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
85f0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8600: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8620: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
8630: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
8640: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
8650: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
8660: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
8670: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
8680: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
8690: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
86a0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
86b0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
86c0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
86d0: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
86e0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
86f0: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8700: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8710: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8720: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8750: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
8780: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
8790: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
87b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
87c0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
87d0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8800: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8820: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
8830: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
8840: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
8850: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
8860: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8870: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
8880: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
8890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
88b0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
88c0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
88d0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
88e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
88f0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8900: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8910: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8930: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
8940: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
8950: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
8960: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
8970: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
8980: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
8990: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
89a0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
89b0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
89c0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
89d0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
89e0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
89f0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8a00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8a10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8a20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8a30: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
8a40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8a50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8a60: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
8a70: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
8a80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8a90: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
8aa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8ab0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8ac0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8ad0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8ae0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8af0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8b00: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8b10: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8b20: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8b30: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8b40: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8b50: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8b60: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
8b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
8b80: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
8b90: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
8ba0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
8bb0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8bc0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
8bd0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8be0: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8bf0: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8c00: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8c10: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8c20: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8c30: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8c40: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8c50: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8c60: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
8c70: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
8c80: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
8c90: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
8ca0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
8cb0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
8cc0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8cd0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8ce0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8cf0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8d00: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8d10: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8d20: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8d30: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8d40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8d50: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8d60: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
8d70: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
8d80: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
8d90: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
8da0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
8db0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
8dc0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8dd0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8de0: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8df0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8e00: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8e10: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8e20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8e30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8e40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8e50: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8e60: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8e70: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8e80: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8e90: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8ea0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8eb0: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8ec0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ed0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ee0: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8ef0: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8f00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8f10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8f20: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8f30: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8f40: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8f50: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8f60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8f70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8f80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8f90: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8fa0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8fb0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8fc0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8fd0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8fe0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8ff0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
9000: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9010: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
9020: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
9030: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
9040: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
9050: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
9060: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
9070: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
9080: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9090: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
90a0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
90b0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
90c0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
90d0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
90e0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
90f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
9100: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9110: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9120: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9130: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
9140: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
9150: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
9160: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9170: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
9180: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9190: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
91a0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
91b0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
91c0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
91d0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
91e0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
91f0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
9200: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
9210: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
9220: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
9230: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
9240: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
9250: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
9260: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
9270: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
9280: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
9290: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
92a0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
92b0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
92c0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
92d0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
92e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
92f0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
9300: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
9310: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
9320: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
9330: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
9340: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
9350: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
9360: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
9370: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
9380: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
9390: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
93a0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
93b0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
93c0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
93d0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
93e0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
93f0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9400: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9410: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9430: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
9440: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9450: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
9460: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
9470: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9480: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
9490: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
94a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
94b0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
94c0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
94d0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
94e0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
94f0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9500: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9530: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9540: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
9550: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9580: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
9590: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
95a0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
95b0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
95c0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
95d0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
95e0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
95f0: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9600: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9610: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  de */.  int usab
9620: 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
9630: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61  e size of the pa
9640: 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  ge */.  .  asser
9650: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
9660: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
9670: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9680: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9690: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
96a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
96b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
96c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
96d0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
96e0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
96f0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9700: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9710: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9720: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9730: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
9740: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
9750: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9760: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9770: 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69  nByte < usableSi
9780: 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67  ze-8 );..  nFrag
9790: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
97a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
97b0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
97c0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
97d0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
97e0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
97f0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9800: 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67  nCell;.  top = g
9810: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9820: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9830: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
9840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
9860: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
9870: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9880: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9890: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
98a0: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
98b0: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
98c0: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
98d0: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
98e0: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
98f0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9900: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9910: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9920: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9930: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
9940: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9950: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
9960: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
9970: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
9980: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
9990: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
99a0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
99b0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
99c0: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
99d0: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
99e0: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
99f0: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9a00: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9a10: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9a20: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
9a30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9a40: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
9a50: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
9a60: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
9a70: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
9a80: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
9a90: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9aa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9ab0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
9ac0: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
9ad0: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
9ae0: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
9af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65      }.      size
9b20: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9b30: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9b40: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
9b50: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
9b60: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
9b70: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
9b80: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
9b90: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
9ba0: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  3 );.        if(
9bb0: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
9bc0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
9bd0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
9be0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
9bf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
9c00: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
9c10: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
9c20: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
9c30: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9c40: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
9c50: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
9c60: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
9c70: 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20  7] = (u8)(nFrag 
9c80: 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  + x);.        }e
9c90: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
9ca0: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
9cb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9cc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9cd0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
9ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
9cf0: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
9d00: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
9d10: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
9d20: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
9d30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
9d40: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
9d50: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
9d60: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
9d70: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
9d80: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  data[pc+2], x);.
9d90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9da0: 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78    *pIdx = pc + x
9db0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9dc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9dd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9de0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
9df0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9e00: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20  enough space in 
9e10: 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73  the gap to satis
9e20: 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f  fy.  ** the allo
9e30: 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c  cation.  If not,
9e40: 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a   defragment..  *
9e50: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
9e60: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
9e70: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
9e80: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72  yte>top ){.    r
9e90: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9ea0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9eb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9ec0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
9ed0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9ee0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
9ef0: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
9f00: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
9f10: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
9f20: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
9f30: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
9f40: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9f50: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
9f60: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9f70: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
9f80: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
9f90: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
9fa0: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
9fb0: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
9fc0: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
9fd0: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
9fe0: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
9ff0: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
a000: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
a010: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
a020: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
a030: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
a040: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
a050: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
a060: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
a070: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
a080: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
a0a0: 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d  +nByte <= pPage-
a0b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a0c0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
a0d0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
a0e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a0f0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
a100: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
a110: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
a120: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
a130: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
a140: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
a150: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
a160: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
a170: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
a180: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
a190: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
a1a0: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
a1b0: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
a1c0: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
a1d0: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
a1e0: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
a1f0: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
a200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
a210: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
a220: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
a230: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
a240: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
a250: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
a260: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
a270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
a280: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
a290: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
a2a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
a2b0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
a2c0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
a2d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
a2e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
a2f0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a300: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a310: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a320: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
a330: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
a340: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a350: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  e );.  assert( (
a360: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
a370: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a380: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a390: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a3a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a3b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a3c0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a3d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a3e0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a3f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a400: 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
a410: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a420: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a430: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a440: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a450: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a460: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a470: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a480: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a490: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a4a0: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a4b0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a4c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a4d0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a4e0: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a4f0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a500: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a510: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a520: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a530: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a540: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a550: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a560: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a570: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a580: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a590: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a5a0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a5b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a5c0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a5d0: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a5e0: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a5f0: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a600: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a610: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a620: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
a630: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
a640: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
a650: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
a660: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
a670: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
a680: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a690: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
a6a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a6b0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a6c0: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
a6d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a6e0: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
a6f0: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
a700: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a710: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a720: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
a730: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
a740: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
a750: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
a760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a770: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a780: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
a790: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
a7a0: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
a7b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a7c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a7d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
a7e0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
a7f0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
a800: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
a810: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
a820: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
a830: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
a840: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a850: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
a860: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
a870: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
a880: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
a890: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
a8a0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
a8b0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
a8c0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
a8d0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
a8e0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
a8f0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
a900: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
a910: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
a920: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a930: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
a940: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a950: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a960: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a970: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a980: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a990: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9a0: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
a9b0: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
a9c0: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
a9d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
a9e0: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
a9f0: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
aa00: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
aa10: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
aa20: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
aa30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
aa50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
aa60: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
aa70: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
aa80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
aa90: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
aaa0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
aab0: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
aac0: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
aad0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
aae0: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
aaf0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ab00: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
ab10: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
ab20: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
ab30: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
ab40: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
ab50: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
ab60: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
ab70: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
ab80: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
ab90: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
aba0: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
abb0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
abc0: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
abd0: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
abe0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
abf0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
ac00: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
ac10: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
ac20: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
ac30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
ac40: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
ac50: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
ac60: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ac70: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
ac80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
ac90: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
aca0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
acb0: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
acc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
acd0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ace0: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
acf0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ad00: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ad10: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ad20: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
ad30: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
ad40: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
ad50: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
ad60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ad70: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
ad80: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ad90: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
ada0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
adb0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
adc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
add0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
ade0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
adf0: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ae00: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ae10: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ae20: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
ae30: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
ae40: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
ae50: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
ae60: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
ae70: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ae80: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
ae90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
aea0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
aeb0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
aec0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
aed0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
aee0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
aef0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
af00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
af10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
af20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
af30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
af40: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
af50: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
af60: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
af70: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
af80: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
af90: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
afa0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
afb0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
afc0: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
afd0: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
afe0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
aff0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b000: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
b010: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
b020: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b030: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b040: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
b050: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b060: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
b070: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
b080: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b090: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b0a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b0b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b0c0: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b0d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b0e0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b0f0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b100: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b110: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
b120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b130: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
b140: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b150: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b160: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b170: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b180: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b190: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b1a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b1b0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b1c0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b1d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b1e0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b1f0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b200: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b210: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b220: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b230: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b240: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b250: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b260: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b270: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b280: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b290: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b2a0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b2c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b2d0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b2e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b2f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b300: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b310: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b320: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b330: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b340: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b350: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b360: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b370: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b390: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b3a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b3b0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b3c0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b3d0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b3e0: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b3f0: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b400: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b420: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b430: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b440: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b450: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b460: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b470: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b480: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b490: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b4a0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b4b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b4c0: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b4d0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b4e0: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b4f0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
b500: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b510: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b520: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b530: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b540: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b550: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b560: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b570: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b580: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
b590: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b5a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b5b0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b5c0: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
b5d0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b5e0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b5f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b600: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b610: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b620: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b630: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b640: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b650: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b660: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b670: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b680: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b690: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b6a0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b6b0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b6c0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b6d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b6e0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b6f0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b700: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b710: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b720: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b730: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b740: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b750: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
b760: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b770: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
b780: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
b790: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b7a0: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
b7b0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
b7c0: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
b7d0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
b7e0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
b7f0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
b800: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
b810: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b820: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b830: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b840: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b850: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b860: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b870: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b880: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b890: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b8a0: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b8b0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b8c0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b8e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b8f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b900: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b910: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b920: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b930: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b940: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b950: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b960: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b970: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b980: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b990: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b9a0: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b9b0: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b9c0: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b9d0: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b9e0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b9f0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
ba00: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
ba10: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
ba20: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
ba30: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
ba40: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
ba50: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
ba60: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
ba70: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
ba80: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
ba90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
baa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
bab0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
bac0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
bad0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
bae0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
baf0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
bb00: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
bb10: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
bb20: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
bb30: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
bb40: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
bb50: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
bb60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
bb70: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
bb80: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bb90: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
bba0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
bbb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bbc0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bbd0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
bbe0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bbf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bc00: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bc10: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bc20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bc30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bc40: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
bc50: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
bc60: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
bc70: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
bc80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bc90: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
bca0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bcb0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
bcc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bce0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bcf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bd00: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bd10: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
bd20: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
bd30: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bd40: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
bd50: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
bd60: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
bd70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bd80: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
bd90: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
bda0: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
bdb0: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bdc0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bdd0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bde0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bdf0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
be00: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
be10: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
be20: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
be30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
be40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
be50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
be60: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
be70: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
be80: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
be90: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bea0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
beb0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bec0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bed0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bee0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bef0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bf00: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bf10: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bf20: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bf30: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bf40: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bf50: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bf60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bf70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bf80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bf90: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bfa0: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bfb0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bfc0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bfd0: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bfe0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bff0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c000: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
c010: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c020: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
c030: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c040: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
c050: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c060: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
c070: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
c080: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c090: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c0a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c0b0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c0c0: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c0d0: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c0e0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c0f0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c100: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c110: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c120: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c130: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c140: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c150: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c160: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c170: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c180: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c190: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c1a0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c1b0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c1c0: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c1d0: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c1e0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c1f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c200: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c210: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c220: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c230: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c240: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c250: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c260: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c270: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c280: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c290: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c2a0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c2b0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c2c0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c2d0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c2e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c2f0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c300: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c310: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c320: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c330: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c350: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c360: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c370: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c380: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c390: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c3a0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c3b0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c3c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c3d0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c3e0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c400: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c410: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c420: 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
c430: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65  Delete ){.    me
c440: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c450: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c460: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c470: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c480: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c490: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c4a0: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c4b0: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c4c0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c4d0: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c4e0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c4f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c500: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c510: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c520: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c530: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c540: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c550: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c560: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c570: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c580: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
c590: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
c5a0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c5b0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
c5c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c5d0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c5e0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c5f0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c600: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c610: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
c620: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c630: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c640: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c650: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c660: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c670: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c680: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c690: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c6a0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c6b0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c6c0: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c6d0: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c6e0: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c6f0: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c700: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c710: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c720: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c730: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c740: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c750: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c760: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c770: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c780: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c790: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c7a0: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c7b0: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c7c0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c7d0: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c7e0: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c7f0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c800: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c810: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c820: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c830: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c840: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c860: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c870: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c880: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c890: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c8a0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c8b0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c8c0: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c8d0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c8e0: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c8f0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c900: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c910: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c920: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c930: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c940: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c950: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c960: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c970: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c980: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c990: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c9a0: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c9b0: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c9c0: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c9d0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
c9e0: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
c9f0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
ca00: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
ca10: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
ca20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ca30: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
ca40: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
ca50: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
ca60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
ca70: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
ca80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
ca90: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
caa0: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
cab0: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
cac0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
cad0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
cae0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
caf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cb00: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
cb10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cb20: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
cb30: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
cb40: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
cb50: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
cb60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cb70: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
cb80: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
cb90: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cba0: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
cbb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cbc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
cbd0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cbe0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
cbf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
cc00: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
cc10: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
cc20: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
cc30: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
cc40: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cc50: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc60: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc70: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
cc80: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cc90: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
cca0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
ccb0: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
ccc0: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
ccd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cce0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
ccf0: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
cd00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
cd10: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
cd20: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
cd30: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
cd40: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
cd50: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
cd60: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
cd70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cd80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cd90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
cda0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
cdb0: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
cdc0: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
cdd0: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
cde0: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
cdf0: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
ce00: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
ce10: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
ce20: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
ce30: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
ce40: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
ce50: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
ce60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
ce70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
ce80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
ce90: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
cea0: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
ceb0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74    return (int)bt
cec0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
ced0: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
cee0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
cef0: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
cf00: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
cf10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
cf20: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
cf30: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
cf40: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
cf50: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
cf60: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
cf70: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
cf80: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
cf90: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
cfa0: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
cfb0: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
cfc0: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
cfd0: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
cfe0: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
cff0: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
d000: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
d010: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
d020: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
d030: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
d040: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d050: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d060: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
d070: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
d080: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
d090: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d0a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d0b0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d0c0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d0d0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d0e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d0f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d100: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d110: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d120: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d130: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d150: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d160: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d170: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
d180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d190: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d1a0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d1b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d1d0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d1e0: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d1f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d200: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d210: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d220: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d230: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d240: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d250: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d260: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d270: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d280: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d290: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d2a0: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d2b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d2c0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d2d0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d2e0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d2f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d300: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d310: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d320: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d330: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d340: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d350: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d360: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d370: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d380: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d390: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d3a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d3b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d3c0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d3d0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d3e0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d3f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d400: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d410: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d420: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d430: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d440: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d450: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d460: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d470: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d480: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d490: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d4a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d4b0: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d4c0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d4d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d4e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d4f0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d500: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d510: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d520: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d530: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d540: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d560: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d570: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d580: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d590: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d5a0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d5b0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d5c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d5d0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d5e0: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d5f0: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d600: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d620: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d630: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d640: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d650: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d660: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d670: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d680: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d690: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d6a0: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d6b0: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d6c0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d6d0: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d6e0: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d6f0: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d700: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d710: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d720: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d730: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d740: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d750: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d760: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d770: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d780: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d790: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d7a0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d7b0: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d7c0: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d7d0: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d7e0: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d7f0: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d800: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d810: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d820: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d830: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d840: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d850: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d860: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d870: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d880: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d890: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d8a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d8b0: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d8c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d8d0: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d8e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d8f0: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d900: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d910: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d920: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d930: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d950: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d960: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d970: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d990: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d9a0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
d9b0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
d9c0: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
d9d0: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
d9e0: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
d9f0: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
da00: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
da10: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
da20: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
da30: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
da40: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
da50: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
da60: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
da70: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
da80: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
da90: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
daa0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
dab0: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
dac0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
dad0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
dae0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
daf0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
db00: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
db10: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
db20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
db30: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
db40: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
db50: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
db60: 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ts.** BTREE_OMIT
db70: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
db80: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
db90: 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e 4f  K.  The BTREE_NO
dba0: 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74  _READLOCK.** bit
dbb0: 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66 20   is also set if 
dbc0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61  the SQLITE_NoRea
dbd0: 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20 73  dlock flags is s
dbe0: 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e  et in db->flags.
dbf0: 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73 20  .** These flags 
dc00: 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
dc10: 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 50  gh into sqlite3P
dc20: 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20 6d  agerOpen() and m
dc30: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61  ust.** be the sa
dc40: 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41 47  me values as PAG
dc50: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
dc60: 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
dc70: 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  DLOCK..**.** If 
dc80: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
dc90: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
dca0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
dcb0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
dcc0: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
dcd0: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
dce0: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
dcf0: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
dd00: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
dd10: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
dd20: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
dd30: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
dd40: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
dd50: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
dd60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
dd70: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
dd80: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
dd90: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
dda0: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
ddb0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
ddc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
ddd0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
dde0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
ddf0: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
de00: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
de10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
de20: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
de30: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
de40: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
de50: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
de60: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
de70: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
de80: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
de90: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
deb0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
dec0: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
ded0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
dee0: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
def0: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
df00: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
df10: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
df20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
df30: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
df40: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
df50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
df60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
df70: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
df80: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
df90: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
dfc0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
dfd0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
dfe0: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
dff0: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
e000: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
e010: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
e020: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e040: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
e050: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
e060: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
e090: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
e0a0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
e0b0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
e0c0: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
e0d0: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
e0e0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
e0f0: 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
e100: 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
e110: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
e120: 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
e130: 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
e140: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
e150: 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
e160: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
e170: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
e180: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
e190: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
e1a0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
e1b0: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
e1c0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
e1d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
e1e0: 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
e1f0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
e200: 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
e210: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
e220: 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
e230: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
e240: 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
e270: 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
e280: 6e 4d 65 6d 6f 72 79 28 64 62 29 29 3b 0a 23 65  nMemory(db));.#e
e290: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
e2a0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
e2b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e2c0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
e2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
e2e0: 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
e2f0: 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
e300: 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
e310: 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
e320: 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
e330: 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
e340: 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
e350: 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
e360: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e370: 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
e380: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
e390: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
e3a0: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e3b0: 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
e3c0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
e3d0: 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
e3e0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e3f0: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
e400: 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
e410: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
e420: 20 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64   & SQLITE_NoRead
e430: 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 66 6c 61 67  lock ){.    flag
e440: 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45  s |= BTREE_NO_RE
e450: 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66  ADLOCK;.  }.  if
e460: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
e470: 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
e480: 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
e490: 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
e4a0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
e4b0: 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
e4c0: 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
e4d0: 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
e4e0: 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
e4f0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
e500: 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
e510: 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
e520: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
e530: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
e540: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
e550: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
e560: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
e570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e580: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
e590: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
e5a0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
e5b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e5c0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
e5d0: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
e5e0: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
e5f0: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
e600: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
e610: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
e620: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
e630: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
e640: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
e650: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
e660: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
e670: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
e680: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
e690: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
e6a0: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
e6b0: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
e6c0: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
e6d0: 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 69 73 54  sMemdb==0 && isT
e6e0: 65 6d 70 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  empDb==0 ){.    
e6f0: 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
e700: 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
e710: 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
e720: 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
e730: 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
e740: 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
e750: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
e760: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
e770: 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  c(nFullPathname)
e780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e790: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
e7a0: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  ed;.      p->sha
e7b0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
e7c0: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
e7d0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
e7e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e7f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e800: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e810: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e820: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e830: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
e840: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
e850: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e860: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
e870: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e880: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e890: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
e8a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e8b0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
e8c0: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
e8d0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
e8e0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
e8f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
e900: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
e910: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e920: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
e930: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
e940: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e950: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e960: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
e970: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
e980: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e990: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
e9a0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
e9b0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
e9c0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
e9d0: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
e9e0: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
e9f0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
ea00: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
ea10: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
ea20: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
ea30: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
ea40: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
ea50: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
ea70: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
ea80: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
ea90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
eaa0: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
eab0: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
eac0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ead0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
eae0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
eaf0: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
eb00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
eb10: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
eb20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
eb30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
eb40: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
eb60: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
eb70: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
eb80: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
eb90: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
eba0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
ebb0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
ebc0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
ebd0: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
ebe0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ebf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ec00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ec10: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
ec20: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
ec30: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
ec40: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ec50: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
ec60: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
ec70: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
ec80: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
ec90: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
eca0: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
ecb0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
ecc0: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
ecd0: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
ece0: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
ecf0: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
ed00: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
ed10: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
ed20: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
ed30: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
ed40: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
ed50: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
ed60: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
ed70: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
ed80: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
ed90: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
eda0: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
edb0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
edc0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
edd0: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
ede0: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
edf0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
ee00: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
ee10: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
ee20: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
ee30: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
ee40: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
ee50: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
ee60: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
ee70: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
ee80: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
ee90: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
eea0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
eeb0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
eec0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
eed0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
eee0: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
eef0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
ef00: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
ef10: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
ef20: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
ef30: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
ef40: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
ef50: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
ef60: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
ef70: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
ef80: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
ef90: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
efa0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
efb0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
efc0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
efd0: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
efe0: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
eff0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
f020: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
f030: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
f040: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f050: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
f060: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
f070: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
f080: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
f090: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
f0a0: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
f0b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f0c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f0d0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f0e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
f0f0: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
f100: 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
f110: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
f120: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
f130: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
f140: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
f150: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
f160: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
f170: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
f180: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
f190: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f1a0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
f1b0: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
f1c0: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
f1d0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 69 66  Bt->pPager);.#if
f1e0: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
f1f0: 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
f200: 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
f210: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70   1;.#endif.    p
f220: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
f230: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
f240: 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
f250: 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
f260: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
f270: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
f280: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
f290: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
f2a0: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
f2b0: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
f2c0: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
f2d0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f2e0: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
f2f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f300: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
f310: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
f320: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
f330: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
f340: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
f350: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
f360: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
f370: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
f380: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
f390: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
f3a0: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
f3b0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
f3c0: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
f3d0: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
f3e0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
f3f0: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
f400: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
f410: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
f420: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
f430: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
f440: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
f450: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
f460: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
f470: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
f480: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
f490: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
f4a0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
f4b0: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
f4c0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f4d0: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
f4e0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
f4f0: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
f500: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f510: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
f520: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f530: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
f540: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
f550: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
f560: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
f570: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
f580: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
f590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f5a0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f5b0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
f5c0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
f5d0: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
f5e0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
f5f0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f600: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f610: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
f620: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
f630: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
f640: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
f650: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
f660: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
f670: 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
f680: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
f690: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f6a0: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
f6b0: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
f6c0: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
f6d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
f6e0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
f6f0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
f700: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
f710: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
f720: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f730: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f740: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
f750: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
f760: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
f770: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
f780: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
f790: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
f7a0: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
f7b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f7c0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f7d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f7e0: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
f7f0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
f800: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  = 1;.      mutex
f810: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
f820: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f830: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
f840: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66  ASTER);.      if
f850: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
f860: 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
f870: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
f880: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
f890: 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
f8a0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
f8b0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
f8c0: 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
f8d0: 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
f8e0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f8f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f900: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
f910: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
f920: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
f930: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f950: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f960: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
f970: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
f980: 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
f990: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f9a0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f9b0: 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
f9c0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f9d0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f9e0: 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
f9f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fa00: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
fa10: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
fa20: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
fa30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
fa40: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
fa50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fa60: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
fa70: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
fa80: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
fa90: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
faa0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
fab0: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
fac0: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
fad0: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
fae0: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
faf0: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
fb00: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
fb10: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fb20: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
fb30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
fb40: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
fb50: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
fb60: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
fb70: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
fb80: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
fb90: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
fba0: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
fbb0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
fbc0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
fbd0: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
fbe0: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
fbf0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
fc00: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
fc10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
fc20: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
fc30: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
fc40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
fc50: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
fc60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fc70: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
fc80: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
fc90: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
fca0: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
fcb0: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
fcc0: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
fcd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fce0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
fcf0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
fd00: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
fd10: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
fd20: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
fd30: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
fd40: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
fd50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fd60: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
fd70: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
fd80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fd90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fda0: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
fdb0: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
fdc0: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
fdd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fde0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
fdf0: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
fe00: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
fe10: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
fe20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fe30: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
fe40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fe50: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
fe60: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
fe70: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
fe80: 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
fe90: 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
fea0: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
feb0: 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
fec0: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
fed0: 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
fee0: 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
fef0: 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
ff00: 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
ff10: 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
ff20: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
ff30: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
ff40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
ff50: 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
ff60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
ff70: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
ff80: 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
ff90: 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
ffa0: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
ffb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
ffc0: 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
ffd0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
ffe0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
fff0: 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
10000 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10010 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
10020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
10040 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
10050 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
10060 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
10070 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
10080 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
10090 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
100a0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
100b0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
100c0 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
100d0 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
100e0 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
100f0 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
10100 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
10110 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
10120 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
10130 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
10140 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
10150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10160 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
10170 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
10180 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
10190 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
101a0 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
101b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
101c0 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
101d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
101e0 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
101f0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10200 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10210 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
10220 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
10230 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
10240 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
10250 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
10260 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
10270 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10280 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
10290 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
102a0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
102b0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
102c0 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
102d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
102e0 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
102f0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10300 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10310 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
10320 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
10330 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
10340 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
10350 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
10360 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
10370 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
10380 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
10390 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
103a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
103b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
103c0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
103d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
103e0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
103f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
10400 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
10410 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
10420 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
10430 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
10440 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
10450 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
10460 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
10470 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
10480 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
10490 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
104a0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
104b0 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
104c0 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
104d0 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
104e0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
104f0 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
10500 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
10510 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
10520 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
10530 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
10540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
10550 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
10560 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
10570 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
10580 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
10590 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
105a0 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
105b0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
105c0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
105d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
105e0 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
105f0 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
10600 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
10610 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10620 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
10630 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
10640 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10650 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
10660 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
10670 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
10680 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
10690 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
106a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
106b0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
106c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
106d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
106e0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
106f0 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
10700 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
10710 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
10720 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
10730 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
10740 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
10750 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10760 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
10770 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
10780 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
10790 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
107a0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
107b0 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
107c0 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
107d0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
107e0 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
107f0 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
10800 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
10810 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
10820 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
10830 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
10840 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10850 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
10860 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
10870 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
10880 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
10890 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
108a0 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
108b0 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
108c0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
108d0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
108e0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
108f0 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
10900 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
10910 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
10920 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
10930 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
10940 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
10950 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
10960 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
10970 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
10980 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
10990 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
109a0 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
109b0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
109c0 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
109d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
109e0 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
109f0 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
10a00 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
10a10 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
10a20 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
10a30 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
10a40 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
10a50 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
10a60 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
10a70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
10a80 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
10a90 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
10aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10ab0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
10ac0 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10ad0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10ae0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10af0 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10b10 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10b20 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
10b30 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
10b40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
10b50 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
10b60 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
10b70 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10b80 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10b90 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10ba0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10bb0 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10bc0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10be0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10bf0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10c00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10c10 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
10c20 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
10c30 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
10c40 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
10c50 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
10c60 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
10c70 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10c80 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10c90 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10ca0 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10cb0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10cc0 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10cd0 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10ce0 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10cf0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10d00 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10d10 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
10d20 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
10d30 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
10d40 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
10d50 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
10d60 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
10d70 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10d80 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10d90 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10da0 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10db0 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10dc0 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10dd0 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10de0 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10df0 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10e00 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10e10 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
10e20 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
10e30 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
10e40 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
10e50 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
10e60 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
10e70 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10e80 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10e90 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10ea0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10eb0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
10ec0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
10ed0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10ee0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10ef0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10f00 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10f10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
10f20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10f30 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
10f40 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
10f50 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
10f60 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
10f70 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10fa0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
10fb0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
10fc0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
10fd0 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
10fe0 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
10ff0 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
11000 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
11010 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
11020 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
11030 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
11040 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
11050 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
11060 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
11070 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
11080 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
11090 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
110a0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
110b0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
110c0 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
110d0 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
110e0 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
110f0 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11100 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11110 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11120 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
11130 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
11140 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
11150 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11160 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
11170 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
11180 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
11190 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
111b0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
111c0 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
111d0 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
111e0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
111f0 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11200 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11210 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11220 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
11230 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
11240 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
11250 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
11260 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
11270 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
11280 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
11290 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
112a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
112b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
112c0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
112d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
112e0 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
112f0 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11300 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11310 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11320 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
11330 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
11340 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
11350 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
11360 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11370 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11380 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
11390 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
113a0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
113b0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
113c0 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
113d0 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
113e0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
113f0 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11400 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11410 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11420 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
11430 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
11440 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
11450 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11460 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
11470 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11480 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11490 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
114a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
114b0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
114c0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
114d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
114e0 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
114f0 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11500 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11520 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
11530 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
11540 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
11550 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11560 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
11570 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
11580 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
11590 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
115a0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
115b0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
115c0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
115d0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
115e0 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
115f0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
11600 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
11610 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
11620 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
11630 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
11640 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
11650 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
11660 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
11670 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
11680 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
11690 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
116a0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
116b0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
116c0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
116d0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
116e0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
116f0 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
11700 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
11710 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11720 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
11730 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
11740 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
11750 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
11760 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
11770 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
11780 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
11790 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
117a0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
117b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
117c0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
117d0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
117e0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
117f0 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
11800 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
11810 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
11820 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
11830 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
11840 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
11850 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
11860 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
11870 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
11880 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
11890 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
118a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
118b0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
118c0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
118d0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
118e0 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
118f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11900 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
11910 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11920 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
11930 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
11940 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
11950 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11960 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
11970 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
11980 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
11990 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
119a0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
119b0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
119c0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
119d0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
119e0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
119f0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
11a00 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11a10 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
11a20 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
11a30 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
11a40 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
11a50 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
11a60 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
11a70 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
11a80 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
11a90 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
11aa0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
11ab0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
11ac0 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
11ad0 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
11ae0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
11af0 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
11b00 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
11b10 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
11b20 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
11b30 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11b40 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
11b50 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
11b60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11b70 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11b80 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
11b90 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
11ba0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
11bb0 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
11bc0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11bd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11be0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
11bf0 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
11c00 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
11c10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11c20 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11c30 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
11c40 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
11c50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11c60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
11c70 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
11c80 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
11c90 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
11ca0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
11cb0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
11cc0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11cd0 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11ce0 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11cf0 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11d00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11d10 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11d20 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11d30 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11d40 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11d50 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11d60 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
11d70 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
11d80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11d90 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
11da0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
11db0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11dc0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11dd0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11de0 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11df0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11e00 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11e10 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11e20 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11e30 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
11e40 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
11e50 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11e60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11e70 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
11e80 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
11e90 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
11ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11eb0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
11ec0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11ed0 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
11ee0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
11ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11f00 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11f10 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
11f20 74 68 65 20 73 65 63 75 72 65 44 65 6c 65 74 65  the secureDelete
11f30 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
11f40 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
11f50 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
11f60 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
11f70 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
11f80 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
11f90 20 6f 66 20 74 68 65 20 73 65 63 75 72 65 44 65   of the secureDe
11fa0 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20  lete.** setting 
11fb0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
11fc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11fd0 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
11fe0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11ff0 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
12000 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
12010 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
12020 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12030 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
12040 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
12050 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
12060 20 28 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20   (newFlag!=0) ? 
12070 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20  1 : 0;.  } .  b 
12080 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65  = p->pBt->secure
12090 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65  Delete;.  sqlite
120a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
120b0 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65    return b;.}.#e
120c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
120d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
120e0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
120f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12100 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
12110 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12120 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
12130 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
12140 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
12150 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
12160 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
12170 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
12180 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
12190 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
121a0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
121b0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
121c0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
121d0 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
121e0 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
121f0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
12200 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
12210 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
12220 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12230 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
12240 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
12250 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
12260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12270 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
12280 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12290 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
122a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
122b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
122c0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
122d0 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
122e0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
122f0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12300 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12310 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29  xed && (av ?1:0)
12320 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
12330 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
12340 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
12360 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
12370 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
12380 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
12390 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
123a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
123b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
123c0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
123d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
123e0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
123f0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12400 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
12410 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
12420 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
12430 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
12440 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12450 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
12460 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
12470 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12480 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
12490 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
124a0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
124b0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
124c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
124d0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
124e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
124f0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
12500 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
12510 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
12520 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12530 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
12540 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
12550 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
12560 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
12580 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
12590 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
125a0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
125b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
125c0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
125d0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
125e0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
125f0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
12600 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
12610 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
12620 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
12630 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
12640 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
12650 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
12660 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
12670 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
12680 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
12690 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
126a0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
126b0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
126c0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
126d0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
126e0 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
126f0 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
12700 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
12710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12720 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
12730 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
12740 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
12750 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
12760 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12770 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
12780 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
12790 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
127a0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
127b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
127c0 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
127d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
127e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
127f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
12800 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
12810 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
12820 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
12830 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
12840 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
12850 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12860 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
12870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12880 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
12890 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
128a0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
128b0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
128c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
128d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
128e0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
128f0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
12900 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
12910 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12920 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
12930 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
12940 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
12950 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
12960 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
12970 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
12980 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
12990 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
129a0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
129b0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
129c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
129d0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
129e0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
129f0 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
12a00 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
12a10 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12a20 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
12a30 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
12a40 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
12a50 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
12a60 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
12a70 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
12a80 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
12a90 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
12aa0 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
12ab0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
12ac0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
12ad0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
12ae0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
12af0 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
12b00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12b10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12b20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12b30 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
12b40 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
12b50 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12b60 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12b70 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
12b80 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12b90 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12ba0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
12bb0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
12bc0 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
12bd0 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
12be0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
12bf0 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
12c00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12c10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12c20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
12c30 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
12c40 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
12c50 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
12c60 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
12c70 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
12c80 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
12c90 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
12ca0 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
12cb0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
12cc0 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
12cd0 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
12ce0 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
12cf0 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
12d00 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
12d10 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
12d20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
12d30 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
12d40 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
12d50 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
12d60 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
12d70 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
12d80 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
12d90 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
12da0 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
12db0 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
12dc0 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
12dd0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
12de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
12df0 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d  1[19]==2 && pBt-
12e00 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20  >doNotUseWAL==0 
12e10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
12e20 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
12e30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12e40 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
12e50 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
12e60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12e80 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12e90 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
12ea0 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
12eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
12ec0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
12ed0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
12ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
12f00 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
12f10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
12f20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
12f30 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
12f40 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
12f50 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
12f60 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
12f70 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
12f80 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
12f90 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
12fa0 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
12fb0 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
12fc0 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
12fd0 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
12fe0 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
12ff0 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
13000 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
13010 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
13020 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
13030 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
13040 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
13050 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
13060 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
13070 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13080 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13090 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
130a0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
130b0 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
130c0 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
130d0 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20  )&pageSize)!=0. 
130e0 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e      || pageSize>
130f0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
13100 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61  SIZE .     || pa
13110 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20  geSize<=256 .   
13120 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
13130 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13150 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
13160 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
13170 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
13180 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
13190 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
131a0 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
131b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
131c0 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
131d0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
131e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
131f0 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
13200 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
13210 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
13220 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
13230 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
13240 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
13250 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
13260 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
13270 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
13280 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
13290 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
132a0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
132b0 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
132c0 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
132d0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
132e0 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
132f0 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
13300 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
13310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
13320 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
13330 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
13340 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
13350 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
13360 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
13370 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
13380 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
13390 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
133a0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
133b0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
133c0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
133f0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
13400 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 50 61     }.    if( nPa
13420 67 65 48 65 61 64 65 72 3e 6e 50 61 67 65 46 69  geHeader>nPageFi
13430 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
13440 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13450 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
13460 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13470 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
13480 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
13490 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
134a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
134b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
134c0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
134d0 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
134e0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
134f0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
13500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13510 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
13520 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
13530 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
13540 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
13550 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13560 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13570 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
13580 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
13590 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
135a0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
135b0 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
135c0 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
135d0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
135e0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
135f0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
13600 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
13610 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
13620 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
13630 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
13640 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
13650 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
13660 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
13670 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
13680 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
13690 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
136a0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
136b0 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
136c0 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
136d0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
136e0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
136f0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
13700 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
13710 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
13720 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
13730 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
13740 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
13750 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
13760 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
13770 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
13780 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
13790 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
137a0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
137b0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
137c0 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
137d0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
137e0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
137f0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
13800 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
13810 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
13820 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
13830 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
13840 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
13850 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
13860 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
13870 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
13880 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
13890 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
138a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
138b0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
138c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
138d0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
138e0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
138f0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
13900 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
13910 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
13920 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13930 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
13940 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
13950 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13960 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13970 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
13980 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
13990 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
139a0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
139b0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
139c0 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
139d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
139e0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
139f0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
13a00 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
13a10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
13a20 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
13a30 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
13a40 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
13a50 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
13a60 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
13a70 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
13a80 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
13a90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13aa0 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
13ab0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13ac0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
13ad0 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
13ae0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
13af0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
13b00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13b10 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13b30 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
13b40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13b50 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
13b60 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
13b70 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13b80 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
13b90 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
13ba0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
13bb0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
13bc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13bd0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
13be0 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
13bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13c00 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
13c10 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
13c20 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
13c30 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
13c40 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
13c50 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
13c60 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
13c70 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
13c80 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
13c90 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
13ca0 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
13cb0 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
13cc0 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
13cd0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
13ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
13cf0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
13d00 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
13d10 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
13d20 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
13d30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
13d40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13d50 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
13d60 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
13d70 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
13d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13d90 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
13da0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
13db0 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
13dc0 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
13dd0 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
13de0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
13df0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
13e00 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13e10 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
13e20 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
13e30 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
13e40 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
13e50 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
13e60 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
13e70 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
13e80 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
13e90 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
13ea0 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
13eb0 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
13ec0 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
13ed0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
13ee0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
13ef0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
13f00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
13f10 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13f20 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
13f30 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
13f40 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
13f50 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
13f60 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
13f70 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
13f80 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
13f90 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
13fa0 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
13fb0 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
13fc0 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
13fd0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
13fe0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
13ff0 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  .  pBt->pageSize
14000 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
14010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14020 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
14030 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
14040 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
14050 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
14060 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
14070 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
14080 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
14090 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
140a0 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
140b0 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
140c0 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
140d0 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
140e0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
140f0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
14100 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
14110 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
14120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14130 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
14140 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
14150 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
14160 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
14170 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
14180 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14190 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
141a0 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
141b0 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
141c0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
141d0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
141e0 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
141f0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
14200 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
14210 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
14220 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
14230 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
14240 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
14250 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
14260 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
14270 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
14280 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
14290 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
142a0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
142b0 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
142c0 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
142d0 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
142e0 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
142f0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
14300 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14310 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
14320 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
14330 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
14340 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
14350 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
14360 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
14370 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
14380 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
14390 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
143a0 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
143b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
143c0 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
143d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
143e0 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
143f0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
14400 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
14410 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14420 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
14430 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14440 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
14450 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14460 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
14470 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
14480 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
14490 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
144a0 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
144b0 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
144c0 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
144d0 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
144e0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
144f0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
14500 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
14510 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
14520 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
14530 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
14540 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
14550 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
14560 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
14570 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
14580 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
14590 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
145a0 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
145b0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
145c0 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
145d0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
145e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
145f0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
14600 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
14610 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
14620 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
14630 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
14640 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
14650 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
14660 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14670 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
14680 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
14690 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
146a0 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
146b0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
146c0 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
146d0 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
146e0 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
146f0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
14700 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
14710 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
14720 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
14730 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
14740 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
14750 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
14760 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
14770 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
14780 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
14790 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
147a0 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
147b0 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
147c0 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
147d0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
147e0 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
147f0 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
14800 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
14810 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
14820 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
14830 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14840 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
14850 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
14860 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14870 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
14880 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
14890 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
148a0 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
148b0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
148c0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
148d0 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
148e0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
148f0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
14900 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
14910 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
14920 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
14930 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
14940 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
14950 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
14960 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
14980 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
14990 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
149a0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
149b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
149c0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
149d0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
149e0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
149f0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
14a00 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
14a10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14a20 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14a30 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
14a40 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14a50 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
14a60 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
14a70 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
14a80 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
14a90 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
14aa0 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
14ab0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
14ac0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
14ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
14ae0 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
14af0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
14b00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14b10 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
14b20 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
14b30 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
14b40 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
14b50 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
14b60 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
14b70 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
14b80 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
14b90 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
14ba0 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
14bb0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
14bc0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
14bd0 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
14be0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
14bf0 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
14c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14c10 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
14c20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14c30 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
14c40 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
14c50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14c60 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
14c70 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
14c80 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
14c90 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
14ca0 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
14cb0 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
14cc0 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
14cd0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
14ce0 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
14cf0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
14d00 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
14d10 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
14d20 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
14d30 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
14d40 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
14d50 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
14d60 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
14d70 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
14d80 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
14d90 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
14da0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
14db0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
14dc0 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61  ;..  pBt->initia
14dd0 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28  llyEmpty = (u8)(
14de0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a  pBt->nPage==0);.
14df0 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
14e00 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
14e10 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
14e20 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
14e30 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
14e40 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
14e50 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
14e60 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
14e70 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
14e80 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
14e90 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
14ea0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
14eb0 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
14ec0 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
14ed0 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
14ee0 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
14ef0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
14f00 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
14f10 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
14f20 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
14f30 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
14f40 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
14f50 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
14f60 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
14f70 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
14f80 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
14f90 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
14fa0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
14fb0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
14fc0 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
14fd0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
14fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
14ff0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
15000 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
15010 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15020 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15030 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15040 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15050 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
15060 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
15070 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
15080 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
15090 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
150a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
150b0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
150c0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
150d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
150e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
150f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15100 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
15110 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
15120 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
15130 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
15140 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
15150 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15160 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
15170 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
15180 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
15190 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
151a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
151b0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
151c0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
151d0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
151e0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
151f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15200 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
15210 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
15220 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d  e ){..assert( p-
15230 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
15240 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
15250 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
15260 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
15270 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
15280 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
15290 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
152a0 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
152b0 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
152c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
152d0 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
152e0 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
152f0 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
15300 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
15310 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
15320 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
15330 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
15340 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
15350 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
15360 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
15370 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
15380 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
15390 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
153a0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
153b0 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
153c0 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
153d0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
153e0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
153f0 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
15400 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31   = (u8)(wrflag>1
15410 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
15420 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
15430 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
15440 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
15450 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
15460 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
15470 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
15480 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
15490 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
154a0 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
154b0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
154c0 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
154d0 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
154e0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
154f0 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
15500 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
15510 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
15520 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
15530 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
15540 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
15550 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
15560 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
15570 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
15580 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
15590 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
155a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
155b0 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
155c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
155d0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
155e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
155f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15600 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
15610 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
15620 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
15630 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
15640 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15650 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
15660 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
15670 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
15680 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
15690 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
156a0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
156b0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
156c0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
156d0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
156e0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
156f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
15700 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
15710 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
15720 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
15730 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
15740 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
15750 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
15760 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15770 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
15780 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
15790 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
157a0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
157b0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
157c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
157d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
157e0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
157f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15800 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
15810 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
15820 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
15830 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
15840 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
15850 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
15860 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
15870 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
15880 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
15890 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
158a0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
158b0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
158c0 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
158d0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
158e0 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
158f0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
15920 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
15930 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15960 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
15970 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
15980 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
159b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
159c0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
159d0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
159e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
159f0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
15a00 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
15a10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15a20 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
15a30 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15a40 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
15a50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
15a60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
15a80 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
15a90 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
15aa0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
15ab0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
15ac0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
15ad0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
15ae0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
15af0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
15b00 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
15b10 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
15b20 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
15b30 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
15b40 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
15b50 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
15b60 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
15b70 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
15b80 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
15b90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15ba0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
15bb0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
15bc0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
15bd0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
15be0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
15bf0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
15c00 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
15c10 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
15c20 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
15c30 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
15c40 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
15c50 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
15c60 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
15c70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
15c80 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
15c90 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
15ca0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
15cb0 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
15cc0 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
15cd0 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
15ce0 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
15cf0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
15d00 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
15d10 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
15d20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
15d30 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
15d40 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
15d50 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
15d60 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
15d70 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
15da0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
15db0 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
15dc0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
15dd0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
15de0 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
15df0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15e00 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
15e10 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
15e20 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
15e30 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
15e40 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
15e50 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
15e60 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
15e70 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
15e80 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
15e90 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
15ea0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
15eb0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
15ec0 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
15ed0 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
15ee0 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
15ef0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
15f00 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
15f10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15f20 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
15f30 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
15f40 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
15f50 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
15f60 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
15f70 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15f80 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
15f90 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
15fa0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
15fb0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
15fc0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
15fd0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
15fe0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
15ff0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
16000 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
16010 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16020 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
16030 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
16040 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
16050 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
16060 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
16070 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
16080 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
16090 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
160a0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
160b0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
160c0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
160d0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
160e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
160f0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
16100 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
16110 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
16120 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
16130 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
16140 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
16150 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
16160 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
16170 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
16180 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
16190 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
161a0 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
161b0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
161c0 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
161d0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
161e0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
161f0 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
16200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
16210 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
16220 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16240 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
16250 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
16260 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
16270 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
16280 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
162a0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
162b0 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
162c0 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
162d0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
162e0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
162f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
16300 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
16310 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
16320 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16330 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
16340 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
16350 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
16360 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
16370 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
16380 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
16390 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
163a0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
163b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
163c0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
163d0 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
163e0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
163f0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
16400 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
16410 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
16420 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
16430 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
16440 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
16450 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
16460 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
16470 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
16480 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
16490 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
164a0 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
164b0 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
164c0 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
164d0 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
164e0 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
164f0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
16500 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
16510 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
16520 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
16530 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
16540 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
16550 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
16560 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
16570 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
16580 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
16590 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
165a0 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
165b0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
165c0 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
165d0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
165e0 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
165f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
16600 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
16610 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
16620 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
16630 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
16640 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
16650 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
16660 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
16670 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
16680 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
16690 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
166a0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
166b0 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
166c0 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
166d0 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
166e0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
166f0 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
16700 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
16710 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
16720 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
16730 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
16740 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
16750 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
16760 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
16770 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
16780 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
16790 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
167a0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
167b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
167c0 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
167d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
167e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
167f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
16800 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
16810 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
16820 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
16830 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
16840 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
16850 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
16860 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
16870 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
16880 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
16890 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
168a0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
168b0 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
168c0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
168d0 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
168e0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
168f0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
16900 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
16910 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
16920 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
16930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
16950 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
16960 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
16970 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
16980 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
16990 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
169a0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
169b0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
169c0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
169d0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
169e0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
169f0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
16a00 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
16a10 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
16a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
16a30 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
16a40 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
16a50 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
16a60 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
16a70 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
16a80 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
16a90 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
16aa0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
16ab0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
16ac0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
16ad0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
16ae0 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
16af0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
16b00 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
16b10 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
16b20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
16b30 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
16b40 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
16b50 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
16b60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
16b80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16b90 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
16ba0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
16bb0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
16bc0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
16bd0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
16be0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
16bf0 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
16c00 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
16c10 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
16c20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16c30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16c50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16c60 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
16c70 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
16c80 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
16c90 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
16ca0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
16cb0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
16cc0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
16cd0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
16ce0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
16cf0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
16d00 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
16d10 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
16d20 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
16d30 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
16d40 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
16d50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
16d60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16d70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16d80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
16d90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16da0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
16db0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
16dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16dd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16de0 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
16df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16e00 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
16e10 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
16e20 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
16e30 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
16e40 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
16e50 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
16e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
16e80 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
16e90 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
16ea0 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
16eb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16ec0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
16ed0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
16ee0 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
16ef0 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
16f00 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
16f10 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
16f20 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
16f30 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
16f40 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
16f50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
16f60 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
16f70 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
16f80 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
16f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16fa0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
16fb0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
16fc0 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
16fd0 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
16fe0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
16ff0 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
17000 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
17010 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
17020 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
17030 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
17040 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
17050 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
17060 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
17070 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
17080 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
17090 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
170a0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
170b0 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
170c0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
170d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
170e0 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
170f0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
17100 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
17110 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
17120 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
17130 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
17140 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
17150 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
17160 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
17170 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17180 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
17190 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
171a0 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
171b0 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
171c0 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
171d0 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
171e0 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
171f0 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
17200 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
17210 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
17220 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
17230 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
17240 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
17250 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
17260 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
17270 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
17280 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
17290 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
172a0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
172b0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
172c0 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
172d0 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
172e0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
172f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
17300 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
17310 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
17320 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
17330 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17340 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
17360 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
17370 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
17380 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
17390 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
173a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
173b0 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
173c0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
173d0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
173e0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
173f0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
17400 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
17410 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
17420 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
17430 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
17440 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
17450 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
17460 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
17470 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
17480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17490 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
174a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
174b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
174c0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
174d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
174e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
174f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
17500 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
17510 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
17520 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
17530 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
17540 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
17550 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
17560 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
17570 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
17580 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
17590 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
175a0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
175b0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
175c0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
175d0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
175e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
175f0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
17600 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
17610 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
17620 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
17630 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
17640 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17650 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
17660 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
17670 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
17680 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
17690 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
176a0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
176b0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
176c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
176d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
176e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
176f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
17700 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
17710 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
17720 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
17730 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
17740 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
17750 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
17760 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
17770 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
17780 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
17790 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
177a0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
177b0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
177c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
177d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
177e0 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
177f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17820 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
17830 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
17840 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
17850 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
17860 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
17870 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
17880 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
17890 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
178a0 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
178b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
178c0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
178d0 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
178e0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
178f0 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
17900 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
17910 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
17920 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
17930 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
17940 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
17950 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
17960 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
17970 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
17980 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
17990 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
179a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
179b0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
179c0 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
179d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
179e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
179f0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
17a00 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
17a10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17a20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
17a30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17a40 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
17a50 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
17a60 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
17a70 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
17a80 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
17a90 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
17aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17ab0 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
17ac0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
17ad0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17af0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
17b00 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
17b10 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
17b20 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d   iFreePg, nFin!=
17b30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17b40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
17b50 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
17b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17b70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17b80 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
17b90 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
17ba0 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  Fin==0 ){.    iL
17bb0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69  astPg--;.    whi
17bc0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
17bd0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17be0 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41  Bt)||PTRMAP_ISPA
17bf0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
17c00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54   ){.      if( PT
17c10 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17c20 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
17c30 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
17c40 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
17c50 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
17c60 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c  , iLastPg, &pPg,
17c70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17c80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17c90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
17ca0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
17cb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17cc0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
17cd0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
17ce0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
17cf0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
17d00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17d10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17d20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17d30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17d40 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
17d50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
17d60 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
17d70 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  e(pBt->pPager, i
17d80 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74  LastPg);.    pBt
17d90 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
17da0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
17db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17dc0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
17dd0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
17de0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
17df0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
17e00 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
17e10 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
17e20 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
17e30 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
17e40 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
17e50 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
17e60 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
17e70 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
17e80 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
17e90 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
17ea0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
17eb0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
17ec0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
17ed0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
17ee0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17ef0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
17f00 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
17f10 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
17f20 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
17f30 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
17f40 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
17f50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17f60 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
17f70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
17f80 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
17f90 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
17fa0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
17fb0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
17fc0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
17fd0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
17fe0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
17ff0 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
18000 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
18010 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
18020 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
18030 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
18040 30 2c 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  0, btreePagecoun
18050 74 28 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28  t(pBt));.    if(
18060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18070 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18080 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
18090 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
180a0 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
180b0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
180c0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
180d0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
180e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
180f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18100 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18110 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18120 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
18130 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
18140 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
18150 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
18160 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
18170 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
18180 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
18190 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
181a0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
181b0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
181c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
181d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
181e0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
181f0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
18200 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
18210 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
18220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
18230 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
18240 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
18250 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
18260 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
18270 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
18280 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
18290 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
182a0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
182b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
182c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
182d0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
182e0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
182f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
18300 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
18310 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
18320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18330 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
18340 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
18350 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
18360 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
18370 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
18380 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
18390 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
183a0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
183b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
183c0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
183d0 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
183e0 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
183f0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
18400 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
18410 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
18420 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
18430 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
18440 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18450 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
18460 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
18470 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
18480 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
18490 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
184a0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72  */.    int nEntr
184b0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  y;        /* Num
184c0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
184d0 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
184e0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  e */.    Pgno nO
184f0 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
18500 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
18510 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
18520 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
18530 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
18540 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
18550 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
18560 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
18570 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18580 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
18590 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
185a0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
185b0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
185c0 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
185d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
185e0 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
185f0 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
18600 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
18610 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
18620 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
18630 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
18640 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
18650 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
18660 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18670 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
18680 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
18690 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
186a0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
186b0 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
186c0 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20  sableSize/5;.   
186d0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
186e0 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
186f0 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
18700 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
18710 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ;.    nFin = nOr
18720 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
18730 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f  rmap;.    if( nO
18740 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
18750 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
18760 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
18770 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
18780 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
18790 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
187a0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
187b0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
187c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
187d0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
187e0 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
187f0 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
18800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18810 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
18820 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
18830 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
18840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
18850 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
18860 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
18870 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
18880 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
18890 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
188a0 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
188b0 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
188c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
188d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
188e0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
188f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18900 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
18910 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
18920 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
18930 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18940 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
18950 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
18960 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18970 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
18980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
18990 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
189a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46  (pBt->pPager, nF
189b0 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
189c0 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
189d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
189e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
189f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
18a00 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
18a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
18a20 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
18a30 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
18a40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
18a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
18a60 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
18a70 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18a80 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
18a90 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
18aa0 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
18ab0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
18ac0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
18ad0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
18ae0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
18af0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
18b00 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
18b10 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
18b20 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
18b30 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
18b40 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
18b50 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
18b60 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
18b70 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
18b80 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
18b90 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
18ba0 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
18bb0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
18bc0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
18bd0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
18be0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
18bf0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18c00 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
18c10 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
18c20 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
18c30 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
18c40 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
18c50 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
18c60 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
18c70 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
18c80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
18c90 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
18ca0 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
18cb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
18cc0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
18cd0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
18ce0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
18cf0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
18d00 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
18d10 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
18d20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
18d30 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
18d40 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
18d50 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18d60 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
18d70 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
18d80 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
18d90 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
18da0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
18db0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
18dc0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
18dd0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
18de0 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
18df0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
18e00 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
18e10 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
18e20 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
18e30 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
18e40 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18e50 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
18e60 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
18e70 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
18e80 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
18e90 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
18ea0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
18eb0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18ec0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
18ed0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
18ee0 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
18ef0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
18f00 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18f10 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
18f20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
18f30 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
18f40 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
18f50 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
18f60 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
18f70 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
18f80 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
18f90 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
18fa0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
18fb0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
18fc0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
18fd0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
18fe0 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
18ff0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
19000 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
19010 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
19020 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
19030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
19040 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
19050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
19060 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19070 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
19080 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19090 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
190a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
190b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
190c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
190d0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
190e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
190f0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
19100 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
19110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19130 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19140 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
19150 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19160 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
19170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19180 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
19190 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
191a0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
191b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
191c0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
191d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
191e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
191f0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
19200 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
19210 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
19220 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
19230 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
19240 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
19250 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
19260 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
19270 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
19280 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
19290 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
192a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
192b0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
192c0 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72  );..  btreeClear
192d0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
192e0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
192f0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
19300 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62  p->db->activeVdb
19310 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  eCnt>1 ){.    /*
19320 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
19330 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
19340 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
19350 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
19360 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
19370 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
19380 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
19390 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
193a0 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
193b0 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
193c0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
193d0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
193e0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
193f0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
19400 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
19410 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
19420 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
19430 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
19440 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
19450 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
19460 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
19470 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
19480 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
19490 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
194a0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
194b0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
194c0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
194d0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
194e0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
194f0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
19500 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
19510 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
19520 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
19530 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
19540 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
19550 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
19560 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
19570 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
19580 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
19590 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
195a0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
195b0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
195c0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
195d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
195e0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
195f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
19600 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
19610 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
19620 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
19630 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
19640 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
19650 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
19660 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
19670 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
19680 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
19690 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
196a0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
196b0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
196c0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
196d0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
196e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
196f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19700 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
19710 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
19720 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
19730 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
19740 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
19750 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
19760 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
19770 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
19780 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
19790 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
197a0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
197b0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
197c0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
197d0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
197e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
197f0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
19800 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
19810 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
19820 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
19830 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
19840 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
19850 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
19860 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
19870 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
19880 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
19890 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
198a0 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
198b0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
198c0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
198d0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
198e0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
198f0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
19900 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
19910 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
19920 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
19930 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
19940 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
19950 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19960 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
19970 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
19980 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
19990 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
199a0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
199b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
199c0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
199d0 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
199e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
199f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19a00 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
19a10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
19a20 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
19a30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
19a40 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
19a50 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
19a60 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
19a70 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
19a80 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
19a90 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
19aa0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
19ab0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
19ac0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
19ad0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
19ae0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
19af0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19b00 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
19b10 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19b20 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
19b30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19b40 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
19b50 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
19b60 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
19b70 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
19b80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
19b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19ba0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
19bb0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19bc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19bd0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
19be0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
19bf0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
19c00 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
19c10 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
19c20 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19c30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19c40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
19c50 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
19c60 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
19c70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
19c80 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
19c90 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
19ca0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19cb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
19cc0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
19cd0 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
19ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19cf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19d00 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
19d10 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
19d20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19d30 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
19d40 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
19d50 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
19d60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
19d70 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
19d80 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
19d90 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
19da0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
19db0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
19dc0 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
19dd0 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
19de0 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
19df0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
19e00 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
19e10 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
19e20 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
19e30 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
19e40 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
19e50 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
19e60 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
19e70 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
19e80 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
19e90 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
19ea0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
19eb0 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
19ec0 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
19ed0 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
19ee0 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
19ef0 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
19f00 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
19f10 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
19f20 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
19f30 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
19f40 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
19f50 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
19f60 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
19f70 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
19f80 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
19f90 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
19fa0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
19fb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
19fc0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19fd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
19fe0 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
19ff0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
1a000 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
1a010 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
1a020 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
1a030 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
1a040 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
1a050 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
1a060 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
1a070 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
1a080 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
1a090 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
1a0a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a0b0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
1a0c0 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
1a0d0 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
1a0e0 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
1a0f0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
1a100 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
1a110 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
1a120 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
1a130 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
1a140 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
1a150 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
1a160 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
1a170 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
1a180 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
1a190 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
1a1a0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1a1b0 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
1a1c0 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
1a1d0 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
1a1e0 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
1a1f0 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
1a200 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
1a210 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
1a220 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
1a230 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
1a240 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1a250 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
1a260 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
1a270 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
1a280 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
1a290 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1a2a0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
1a2b0 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1a2c0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1a2d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1a2e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1a2f0 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
1a300 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
1a310 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
1a320 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
1a330 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
1a340 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
1a350 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1a360 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
1a370 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
1a380 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
1a390 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1a3a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1a3b0 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
1a3c0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
1a3d0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1a3e0 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
1a3f0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
1a400 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
1a410 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
1a420 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
1a430 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
1a440 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
1a450 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
1a460 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
1a470 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
1a480 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
1a490 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1a4a0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1a4b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a4c0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1a4d0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1a4e0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1a4f0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1a500 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1a510 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
1a520 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
1a530 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1a540 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1a550 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1a560 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
1a570 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a580 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1a590 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1a5a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a5b0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1a5c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a5d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
1a5e0 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
1a5f0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
1a600 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
1a610 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
1a620 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
1a630 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
1a640 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
1a650 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
1a660 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
1a670 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
1a680 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
1a690 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
1a6a0 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
1a6b0 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
1a6c0 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
1a6d0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
1a6e0 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
1a6f0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
1a700 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
1a710 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
1a720 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
1a730 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
1a740 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
1a750 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
1a760 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
1a770 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
1a780 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
1a790 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
1a7a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1a7b0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1a7c0 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
1a7d0 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
1a7e0 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
1a7f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a800 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1a810 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
1a820 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
1a830 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
1a840 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
1a850 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
1a860 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
1a870 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
1a880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a890 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1a8a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1a8b0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
1a8c0 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
1a8d0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
1a8e0 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
1a8f0 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
1a900 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
1a910 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
1a920 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
1a930 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
1a940 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
1a950 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
1a960 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
1a970 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
1a980 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
1a990 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1a9a0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
1a9b0 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
1a9c0 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
1a9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
1a9e0 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
1a9f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1aa00 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
1aa10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1aa20 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
1aa30 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
1aa40 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1aa50 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1aa60 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
1aa70 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
1aa80 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1aa90 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
1aaa0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1aab0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1aac0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1aad0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1aae0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1aaf0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1ab00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
1ab10 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
1ab20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1ab30 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1ab40 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f  on can can be ro
1ab50 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
1ab60 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
1ab70 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1ab80 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
1ab90 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
1aba0 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
1abb0 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
1abc0 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1abd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
1abe0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1abf0 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
1ac00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
1ac10 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
1ac20 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
1ac30 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1ac40 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
1ac50 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
1ac60 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
1ac70 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
1ac80 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
1ac90 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
1aca0 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
1acb0 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
1acc0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
1acd0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
1ace0 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
1acf0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
1ad00 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1ad10 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1ad20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1ad30 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1ad40 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
1ad50 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
1ad60 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
1ad70 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
1ad80 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
1ad90 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
1ada0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1adb0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
1adc0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1add0 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
1ade0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
1adf0 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
1ae00 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
1ae10 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
1ae20 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
1ae30 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
1ae40 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
1ae50 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
1ae60 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
1ae70 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
1ae80 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
1ae90 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
1aea0 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
1aeb0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
1aec0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1aed0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1aee0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
1aef0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1af00 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
1af10 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
1af20 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1af30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1af40 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1af50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1af60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1af70 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1af80 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1af90 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
1afa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1afb0 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
1afc0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1afd0 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
1afe0 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
1aff0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b000 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1b010 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
1b020 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
1b030 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1b040 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
1b050 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
1b060 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
1b070 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
1b080 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
1b090 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
1b0a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
1b0b0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
1b0c0 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
1b0d0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
1b0e0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
1b0f0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
1b100 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1b110 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1b120 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
1b130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b140 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1b150 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
1b160 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
1b170 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b180 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b190 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1b1a0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1b1b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
1b1c0 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
1b1d0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
1b1e0 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
1b1f0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
1b200 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
1b210 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
1b220 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
1b230 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
1b240 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
1b250 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
1b260 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
1b270 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
1b280 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
1b290 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
1b2a0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1b2b0 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
1b2c0 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
1b2d0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
1b2e0 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
1b2f0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
1b300 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1b310 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
1b320 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
1b330 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
1b340 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
1b350 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
1b360 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
1b370 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
1b380 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
1b390 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
1b3a0 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
1b3b0 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
1b3c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b3d0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
1b3e0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
1b3f0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
1b400 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1b410 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
1b420 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1b430 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1b440 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b450 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1b460 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
1b470 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
1b480 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1b490 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
1b4a0 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
1b4b0 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
1b4c0 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
1b4d0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
1b4e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1b4f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
1b500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b510 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
1b520 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
1b530 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
1b540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
1b560 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 70 42 74  vepoint<0 && pBt
1b570 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79  ->initiallyEmpty
1b580 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20   ) pBt->nPage = 
1b590 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65  0;.      rc = ne
1b5a0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1b5b0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1b5c0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
1b5d0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1b5e0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
1b5f0 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1b600 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
1b610 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
1b620 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
1b630 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
1b640 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1b650 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
1b660 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
1b670 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
1b680 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
1b690 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1b6a0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
1b6b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1b6c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b6d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b6e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
1b6f0 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
1b700 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
1b710 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
1b720 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
1b730 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
1b740 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
1b750 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
1b760 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
1b770 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
1b780 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
1b790 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1b7a0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
1b7b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
1b7c0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
1b7d0 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
1b7e0 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
1b7f0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
1b800 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
1b810 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
1b820 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
1b830 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
1b840 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1b850 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
1b860 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
1b870 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
1b880 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
1b890 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1b8a0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
1b8b0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
1b8c0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
1b8d0 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
1b8e0 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
1b8f0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
1b900 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
1b910 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
1b920 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
1b930 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
1b940 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
1b950 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1b960 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
1b970 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
1b980 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1b990 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
1b9a0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
1b9b0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
1b9c0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
1b9d0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
1b9e0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
1b9f0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
1ba00 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
1ba10 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
1ba20 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
1ba30 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
1ba40 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
1ba50 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
1ba60 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
1ba70 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
1ba80 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
1ba90 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
1baa0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1bab0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
1bac0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
1bad0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
1bae0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
1baf0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
1bb00 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
1bb10 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
1bb20 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
1bb30 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
1bb40 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1bb50 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
1bb60 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
1bb70 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
1bb80 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
1bb90 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
1bba0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
1bbb0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
1bbc0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
1bbd0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1bbe0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
1bbf0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
1bc00 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1bc10 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
1bc20 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
1bc30 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
1bc40 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1bc50 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
1bc60 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
1bc70 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1bc80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bca0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1bcb0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcd0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
1bce0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
1bcf0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
1bd00 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1bd30 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1bd40 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1bd50 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1bd60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1bd70 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
1bd80 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
1bd90 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
1bdc0 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
1bdd0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
1bde0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be00 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
1be10 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73   handle */..  as
1be20 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1be30 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1be40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1be50 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
1be60 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ==1 );..  /* The
1be70 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1be80 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72  t statements ver
1be90 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73  ify that if this
1bea0 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a   is a sharable .
1beb0 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61    ** b-tree data
1bec0 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63  base, the connec
1bed0 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
1bee0 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1bef0 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20  le locks, .  ** 
1bf00 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  and that no othe
1bf10 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
1bf20 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
1bf30 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
1bf40 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20  with .  ** this 
1bf50 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
1bf60 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
1bf70 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  heTableLock(p, i
1bf80 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21  Table, pKeyInfo!
1bf90 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b  =0, wrFlag+1) );
1bfa0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1bfb0 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
1bfc0 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
1bfd0 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
1bfe0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
1bff0 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
1c000 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
1c010 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
1c020 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1c030 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
1c040 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1c050 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
1c060 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1c070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1c080 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
1c090 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1c0a0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72  ..  if( NEVER(wr
1c0b0 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61  Flag && pBt->rea
1c0c0 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65  dOnly) ){.    re
1c0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
1c0e0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
1c0f0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
1c100 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1c110 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1c120 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  n SQLITE_EMPTY;.
1c130 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
1c140 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
1c150 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
1c160 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
1c170 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
1c180 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
1c190 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
1c1a0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
1c1b0 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
1c1c0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
1c1d0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
1c1e0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
1c1f0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
1c200 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1c210 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
1c220 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
1c230 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  pBt;.  pCur->wrF
1c240 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67  lag = (u8)wrFlag
1c250 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  ;.  pCur->pNext 
1c260 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
1c270 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1c280 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
1c290 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1c2a0 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70  ur;.  }.  pBt->p
1c2b0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
1c2c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1c2d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1c2e0 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f    pCur->cachedRo
1c2f0 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  wid = 0;.  retur
1c300 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
1c310 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1c320 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1c330 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c350 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1c360 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1c370 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1c3a0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1c3b0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1c3c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1c3f0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1c400 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1c410 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c430 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
1c440 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
1c450 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1c480 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
1c490 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1c4a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1c4b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1c4c0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
1c4d0 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
1c4e0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
1c4f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1c500 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1c510 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c520 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1c530 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
1c540 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
1c550 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
1c560 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
1c570 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
1c580 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
1c590 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
1c5a0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
1c5b0 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
1c5c0 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
1c5d0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
1c5e0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
1c5f0 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
1c600 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
1c610 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
1c620 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
1c630 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
1c640 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1c650 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
1c660 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
1c670 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
1c680 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1c690 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
1c6a0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
1c6b0 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
1c6c0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
1c6d0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
1c6e0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
1c6f0 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
1c700 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
1c710 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
1c720 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
1c730 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
1c740 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
1c750 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
1c760 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
1c770 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
1c780 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
1c790 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
1c7a0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
1c7b0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
1c7c0 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
1c7d0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
1c7e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1c7f0 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
1c800 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
1c810 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
1c820 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
1c830 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1c840 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61   cached rowid va
1c850 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72  lue of every cur
1c860 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20  sor in the same 
1c870 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1c880 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76   as pCur and hav
1c890 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ing the same roo
1c8a0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  t page number as
1c8b0 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75   pCur.  The valu
1c8c0 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69  e is.** set to i
1c8d0 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  Rowid..**.** Onl
1c8e0 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64  y positive rowid
1c8f0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1c900 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72  idered valid for
1c910 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20   this cache..** 
1c920 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69  The cache is ini
1c930 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1c940 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
1c950 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a  invalid cache..*
1c960 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77  * A btree will w
1c970 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65  ork fine with ze
1c980 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1c990 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20  owids.  We just 
1c9a0 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20  cannot.** cache 
1c9b0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1c9c0 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d   rowids, which m
1c9d0 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74  eans tables that
1c9e0 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20   use zero or.** 
1c9f0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1ca00 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
1ca10 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20  le slower.  But 
1ca20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72  in practice, zer
1ca30 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65  o.** or negative
1ca40 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79   rowids are very
1ca50 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69   uncommon so thi
1ca60 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
1ca70 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
1ca80 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  id sqlite3BtreeS
1ca90 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1caa0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71  Cursor *pCur, sq
1cab0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77  lite3_int64 iRow
1cac0 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  id){.  BtCursor 
1cad0 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72  *p;.  for(p=pCur
1cae0 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1caf0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1cb00 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
1cb10 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  oot==pCur->pgnoR
1cb20 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52  oot ) p->cachedR
1cb30 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1cb40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1cb50 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d  r->cachedRowid==
1cb60 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a  iRowid );.}../*.
1cb70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61  ** Return the ca
1cb80 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74  ched rowid for t
1cb90 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e  he given cursor.
1cba0 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20    A negative or 
1cbb0 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76  zero.** return v
1cbc0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74  alue indicates t
1cbd0 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61  hat the rowid ca
1cbe0 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61  che is invalid a
1cbf0 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  nd should be.** 
1cc00 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65  ignored.  If the
1cc10 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73   rowid cache has
1cc20 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1cc30 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a  en set, then a.*
1cc40 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * zero is return
1cc50 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  ed..*/.sqlite3_i
1cc60 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
1cc70 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eGetCachedRowid(
1cc80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1cc90 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1cca0 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a  cachedRowid;.}..
1ccb0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1ccc0 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1ccd0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1cce0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1ccf0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1cd00 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1cd10 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1cd20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1cd30 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1cd40 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1cd50 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1cd60 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1cd70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1cd80 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1cd90 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1cda0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1cdb0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1cdc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1cdd0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1cde0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1cdf0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1ce00 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1ce10 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1ce20 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1ce30 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1ce40 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1ce50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ce60 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1ce70 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1ce80 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1ce90 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1cea0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1ceb0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1cec0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1ced0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1cee0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1cef0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1cf00 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
1cf10 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
1cf20 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
1cf30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1cf40 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
1cf50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1cf60 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1cf70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1cf80 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1cf90 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
1cfa0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1cfb0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
1cfc0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
1cfd0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
1cfe0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1cff0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
1d000 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
1d010 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1d020 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1d030 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1d040 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1d050 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1d060 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1d070 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1d080 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1d090 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
1d0a0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
1d0b0 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
1d0c0 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
1d0d0 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
1d0e0 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
1d0f0 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
1d100 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
1d110 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
1d120 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1d130 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
1d140 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
1d150 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
1d160 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
1d170 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
1d180 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
1d190 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
1d1a0 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
1d1b0 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
1d1c0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
1d1d0 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
1d1e0 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
1d1f0 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
1d200 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1d210 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
1d220 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
1d230 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
1d240 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
1d250 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1d260 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
1d270 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
1d280 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1d290 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1d2a0 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
1d2b0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1d2c0 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
1d2d0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
1d2e0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
1d2f0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1d300 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
1d310 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
1d320 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
1d330 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
1d340 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
1d350 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
1d360 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
1d370 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
1d380 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
1d390 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
1d3a0 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
1d3b0 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
1d3c0 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
1d3d0 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
1d3e0 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
1d3f0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
1d400 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1d410 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
1d420 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1d430 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
1d440 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1d450 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
1d460 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1d470 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1d480 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1d490 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
1d4a0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1d4b0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
1d4c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
1d4d0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1d4e0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
1d4f0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
1d500 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
1d510 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
1d520 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
1d530 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
1d540 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
1d550 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
1d560 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1d5a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1d5b0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1d5f0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1d600 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20   pCur->iPage;   
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  \.    btreeParse
1d650 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1d660 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1d670 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1d680 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
1d690 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1d6a0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1d6e0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1d730 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1d740 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1d780 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
1d790 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  C_VER */..#ifnde
1d7a0 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
1d7b0 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
1d7c0 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1d7d0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1d7e0 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
1d7f0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
1d800 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
1d810 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
1d820 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
1d830 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
1d840 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
1d850 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
1d860 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
1d870 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
1d880 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
1d890 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
1d8a0 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1d8b0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1d8c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d8d0 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
1d8e0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1d8f0 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
1d900 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1d910 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
1d920 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
1d930 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1d940 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1d950 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
1d960 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
1d970 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
1d980 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1d990 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
1d9a0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1d9b0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
1d9c0 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
1d9d0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
1d9e0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
1d9f0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
1da00 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
1da10 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1da20 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
1da30 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
1da40 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1da50 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1da60 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
1da70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
1da80 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
1da90 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1daa0 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
1dab0 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
1dac0 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
1dad0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1dae0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
1daf0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
1db00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1db10 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
1db20 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1db30 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1db40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1db50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1db60 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
1db70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1db80 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
1db90 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1dba0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1dbb0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65  *pSize = 0;.  }e
1dbc0 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c  lse{.    getCell
1dbd0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1dbe0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1dbf0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1dc00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dc10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
1dc20 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
1dc30 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1dc40 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
1dc50 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
1dc60 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1dc70 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
1dc80 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
1dc90 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
1dca0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1dcb0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
1dcc0 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
1dcd0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1dce0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1dcf0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
1dd00 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
1dd10 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
1dd20 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
1dd30 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
1dd40 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1dd50 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
1dd60 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
1dd70 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1dd80 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
1dd90 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
1dda0 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
1ddb0 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
1ddc0 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
1ddd0 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
1dde0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
1ddf0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
1de00 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
1de10 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1de20 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1de30 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1de40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1de50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1de60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1de70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1de80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
1de90 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1dea0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1deb0 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72  >info.nData;.  r
1dec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ded0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1dee0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1def0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
1df00 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1df10 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
1df20 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
1df30 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1df40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1df50 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1df60 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
1df70 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
1df80 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
1df90 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
1dfa0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1dfb0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
1dfc0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
1dfd0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
1dfe0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
1dff0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
1e000 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e010 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e020 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1e030 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
1e040 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
1e050 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1e060 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1e070 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1e080 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1e090 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
1e0a0 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
1e0b0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1e0c0 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
1e0d0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
1e0e0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
1e0f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
1e100 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1e110 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
1e120 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
1e130 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
1e140 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
1e150 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
1e160 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
1e170 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
1e180 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
1e190 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
1e1a0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1e1b0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1e1c0 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
1e1d0 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
1e1e0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
1e1f0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
1e200 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
1e210 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
1e220 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
1e230 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
1e240 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1e250 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
1e260 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
1e270 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
1e280 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
1e290 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
1e2a0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1e2b0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
1e2c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1e2d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
1e2e0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1e2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1e300 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1e310 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
1e320 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1e330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1e340 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
1e350 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
1e360 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
1e370 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
1e380 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
1e390 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1e3a0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
1e3b0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
1e3c0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1e3d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e3e0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1e3f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1e400 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1e410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
1e420 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
1e430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e440 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
1e450 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
1e460 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1e470 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
1e480 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
1e490 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
1e4a0 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
1e4b0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
1e4c0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
1e4d0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
1e4e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
1e4f0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
1e500 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
1e510 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
1e520 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
1e530 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
1e540 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
1e550 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
1e560 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
1e570 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
1e580 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1e590 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
1e5a0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
1e5b0 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
1e5c0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
1e5d0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
1e5e0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1e5f0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
1e600 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
1e610 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1e620 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
1e630 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
1e640 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
1e650 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
1e660 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1e670 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
1e680 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
1e690 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e6a0 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
1e6b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1e6c0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
1e6d0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
1e6e0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
1e6f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1e700 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1e710 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1e720 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
1e730 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
1e740 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
1e750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e760 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1e770 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1e780 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1e790 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1e7a0 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
1e7b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1e7c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e7d0 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1e7e0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1e7f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1e800 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1e810 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1e820 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1e830 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1e840 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1e850 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1e860 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1e870 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1e880 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1e890 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1e8a0 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1e8b0 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1e8c0 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1e8d0 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1e8e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1e8f0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1e900 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1e910 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1e920 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1e930 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1e940 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1e950 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1e960 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1e970 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1e980 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1e990 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1e9a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e9b0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1e9c0 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1e9d0 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1e9e0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1e9f0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1ea00 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1ea10 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1ea20 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1ea30 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1ea40 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1ea50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ea60 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1ea70 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1ea80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1ea90 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1eaa0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1eab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1eac0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1ead0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1eae0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1eaf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1eb00 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1eb10 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb30 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1eb40 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1eb50 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
1eb60 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
1eb70 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
1eb80 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
1eb90 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
1eba0 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
1ebb0 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
1ebc0 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
1ebd0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
1ebe0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1ebf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ec00 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1ec10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ec20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ec30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
1ec40 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1ec50 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
1ec60 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
1ec70 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
1ec80 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
1ec90 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
1eca0 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
1ecb0 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
1ecc0 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
1ecd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ece0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ecf0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1ed00 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1ed10 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1ed20 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1ed30 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1ed40 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1ed50 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1ed60 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1ed70 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1ed80 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1ed90 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1eda0 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1edb0 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1edc0 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1edd0 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1ede0 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1edf0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1ee00 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1ee10 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1ee20 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1ee30 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1ee40 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1ee50 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1ee60 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
1ee70 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
1ee80 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
1ee90 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
1eea0 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
1eeb0 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1eec0 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1eed0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
1eee0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1eef0 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1ef00 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1ef10 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1ef20 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1ef30 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1ef40 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1ef50 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1ef60 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1ef70 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1ef80 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1ef90 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1efa0 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1efb0 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1efc0 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1efd0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1efe0 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1eff0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1f000 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1f010 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1f020 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1f030 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f040 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1f050 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1f060 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1f070 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1f080 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1f090 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1f0a0 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1f0b0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1f0c0 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1f0d0 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1f0e0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1f0f0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1f100 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1f110 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1f120 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1f130 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1f140 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1f150 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1f160 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1f170 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1f180 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1f190 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1f1a0 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1f1b0 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1f1c0 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1f1d0 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1f1e0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1f1f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1f200 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1f210 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1f220 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1f230 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1f240 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1f250 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1f260 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1f270 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1f280 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1f290 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1f2a0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1f2b0 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1f2c0 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1f2d0 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1f2e0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1f2f0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1f300 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1f310 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1f320 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1f330 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1f340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f350 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1f360 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1f370 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1f380 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f390 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1f3a0 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1f3b0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1f3c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f3d0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1f3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1f3f0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1f400 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1f410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1f420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f430 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f440 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1f450 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1f460 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1f470 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1f480 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f490 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f4a0 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
1f4b0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1f4c0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1f4d0 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
1f4e0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
1f4f0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
1f500 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
1f510 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
1f520 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
1f530 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
1f540 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
1f550 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
1f560 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1f570 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
1f580 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
1f590 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
1f5a0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
1f5b0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
1f5c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1f5d0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
1f5e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1f5f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f600 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1f610 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
1f620 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
1f630 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
1f640 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
1f650 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
1f660 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1f670 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
1f680 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
1f690 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
1f6a0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
1f6b0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
1f6c0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
1f6d0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
1f6e0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1f6f0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
1f700 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
1f710 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1f720 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
1f730 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
1f740 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
1f750 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
1f760 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1f770 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
1f780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f790 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
1f7a0 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
1f7b0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1f7c0 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
1f7d0 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
1f7e0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
1f7f0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
1f800 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1f810 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
1f820 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1f830 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
1f840 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1f850 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
1f860 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
1f870 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
1f880 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
1f890 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
1f8a0 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
1f8b0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
1f8c0 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
1f8d0 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
1f8e0 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
1f8f0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
1f900 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1f910 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1f920 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
1f930 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
1f940 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
1f950 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
1f960 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
1f970 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
1f980 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
1f990 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
1f9a0 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
1f9b0 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
1f9c0 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
1f9d0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
1f9e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
1f9f0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
1fa00 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
1fa10 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1fa20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
1fa30 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
1fa40 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
1fa50 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
1fa60 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
1fa70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
1fa80 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
1fa90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1faa0 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
1fab0 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69        /* nOvfl i
1fac0 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  s always positiv
1fad0 65 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a  e.  If it were z
1fae0 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61  ero, fetchPayloa
1faf0 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20  d would have.   
1fb00 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20     ** been used 
1fb10 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20  instead of this 
1fb20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
1fb30 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76    if( ALWAYS(nOv
1fb40 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  fl) && !pCur->aO
1fb50 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1fb60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1fb70 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
1fb80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1fb90 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1fba0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1fbb0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
1fbc0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
1fbd0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
1fbe0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
1fbf0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
1fc00 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
1fc10 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
1fc20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1fc30 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1fc40 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1fc50 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
1fc60 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
1fc70 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
1fc80 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
1fc90 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1fca0 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
1fcb0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
1fcc0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
1fcd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1fce0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
1fcf0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
1fd00 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
1fd10 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
1fd20 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1fd30 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
1fd40 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
1fd50 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1fd60 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
1fd70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
1fd80 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1fd90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
1fda0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1fdb0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
1fdc0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
1fdd0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
1fde0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1fdf0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
1fe00 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
1fe10 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
1fe20 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
1fe30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1fe40 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
1fe50 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1fe60 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
1fe70 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1fe80 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1fe90 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1fea0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
1feb0 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
1fec0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
1fed0 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
1fee0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
1fef0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
1ff00 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
1ff10 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
1ff20 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
1ff30 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
1ff40 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
1ff50 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
1ff60 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
1ff70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1ff80 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
1ff90 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1ffa0 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1ffb0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
1ffc0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
1ffd0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1ffe0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
1fff0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
20000 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
20010 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
20020 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
20030 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
20040 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
20050 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
20060 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20070 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
20080 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
20090 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
200a0 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
200b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
200c0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
200d0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
200e0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
200f0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
20100 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
20110 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
20120 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
20130 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
20140 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20150 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
20160 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
20170 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
20180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20190 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
201a0 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
201b0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
201c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
201d0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
201e0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
201f0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
20200 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
20210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
20220 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
20230 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
20240 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
20250 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
20260 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
20270 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
20280 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20290 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
202a0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
202b0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
202c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
202d0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
202e0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
202f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
20310 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20320 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
20330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20340 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20360 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
20370 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
20380 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
20390 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
203a0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
203b0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
203c0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
203d0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
203e0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
203f0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
20400 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
20410 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
20420 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
20430 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
20440 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
20450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
20460 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
20470 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
20480 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
20490 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
204a0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
204b0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
204c0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
204d0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
204e0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
204f0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
20500 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
20510 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
20520 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
20530 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20540 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20560 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20570 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
20580 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
20590 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
205a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
205b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
205c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
205d0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
205e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
205f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
20600 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
20610 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
20620 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
20630 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
20640 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
20650 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
20660 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
20670 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
20680 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
20690 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
206a0 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
206b0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
206c0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
206d0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
206e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
206f0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
20700 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
20710 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
20720 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
20730 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
20740 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
20750 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
20760 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
20770 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
20780 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
20790 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
207a0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
207b0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
207c0 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
207d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
207e0 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
207f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
20800 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
20810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
20820 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
20830 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
20840 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
20850 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
20860 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
20870 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
20880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20890 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
208a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
208b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
208c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
208d0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
208e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
208f0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
20900 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
20910 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
20920 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20930 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
20940 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
20950 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
20960 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
20970 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20980 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
20990 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
209a0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
209b0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
209c0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
209d0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
209e0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
209f0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
20a00 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
20a10 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
20a20 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
20a30 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
20a40 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
20a50 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
20a60 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
20a70 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
20a80 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
20a90 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
20aa0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
20ab0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
20ac0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
20ad0 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
20ae0 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
20af0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20b00 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
20b10 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
20b20 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
20b30 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
20b40 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
20b50 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
20b60 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
20b70 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
20b80 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
20b90 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
20ba0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
20bb0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
20bc0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
20bd0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
20be0 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
20bf0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
20c00 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
20c10 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
20c20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
20c30 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
20c40 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
20c50 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
20c60 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
20c70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
20c80 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
20c90 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
20ca0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
20cb0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
20cc0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
20cd0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
20ce0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
20cf0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
20d00 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
20d10 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
20d20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
20d30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
20d40 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
20d50 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
20d60 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
20d70 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
20d80 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
20d90 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
20da0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
20db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
20dc0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
20dd0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
20de0 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
20df0 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
20e00 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
20e10 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
20e20 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
20e30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20e40 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
20e50 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
20e60 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
20e70 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
20e80 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
20e90 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
20ea0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20eb0 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
20ec0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
20ed0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
20ef0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20f00 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
20f10 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
20f20 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
20f30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
20f40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
20f50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
20f60 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
20f70 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29  ->info.nSize==0)
20f80 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72   ){.    btreePar
20f90 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
20fa0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20fb0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
20fc0 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
20fe0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
20ff0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
21000 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
21010 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
21020 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
21030 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
21040 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
21050 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
21060 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
21070 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
21080 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
21090 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
210a0 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
210b0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
210c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
210d0 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
210e0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
210f0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
21100 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d  assert( nLocal<=
21110 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70  nKey );.  }.  *p
21120 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
21130 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
21140 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
21150 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
21160 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
21170 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
21180 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
21190 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
211a0 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
211b0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
211c0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
211d0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
211e0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
211f0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
21200 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
21210 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
21220 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
21230 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
21240 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
21250 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
21260 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
21270 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
21280 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
21290 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
212a0 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
212b0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
212c0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
212d0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
212e0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
212f0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
21300 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
21310 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
21320 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
21330 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
21340 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
21350 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
21360 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
21370 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
21380 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
21390 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
213a0 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
213b0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
213c0 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
213d0 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
213e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
213f0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
21400 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
21410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
21420 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21430 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
21440 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
21450 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
21460 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
21470 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
21480 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
21490 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
214a0 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n p;.}.const voi
214b0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
214c0 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
214d0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
214e0 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
214f0 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
21500 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21510 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
21520 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
21530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
21540 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21550 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
21560 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
21570 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
21580 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
21590 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
215a0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
215b0 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
215c0 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n p;.}.../*.** M
215d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
215e0 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
215f0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
21600 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
21610 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
21620 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
21630 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
21640 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
21650 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
21660 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
21670 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
21680 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
21690 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
216a0 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
216b0 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
216c0 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
216d0 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
216e0 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
216f0 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
21700 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
21710 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
21720 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
21730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
21740 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
21750 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
21760 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
21770 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
21780 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
21790 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
217a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
217b0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
217c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
217d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
217e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
217f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21800 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
21810 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
21820 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
21830 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
21840 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
21850 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
21860 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21870 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
21880 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
21890 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
218a0 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
218b0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
218c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
218d0 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
218e0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
218f0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
21900 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
21910 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
21920 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
21930 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
21940 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
21950 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
21960 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
21970 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
21980 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
21990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
219a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
219b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
219c0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  OK;.}..#ifndef N
219d0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
219e0 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
219f0 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
21a00 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
21a10 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
21a20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
21a30 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
21a40 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
21a50 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
21a60 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
21a70 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
21a80 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
21a90 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
21aa0 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
21ab0 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
21ac0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
21ad0 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
21ae0 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
21af0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
21b00 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
21b10 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
21b20 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
21b30 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
21b40 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
21b50 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
21b60 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
21b70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
21b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
21b90 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
21ba0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
21bb0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
21bc0 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
21bd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
21be0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
21bf0 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
21c00 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
21c10 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
21c20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
21c30 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
21c40 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
21c50 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
21c60 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
21c70 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
21c80 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
21c90 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
21ca0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
21cb0 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
21cc0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
21cd0 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
21ce0 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
21cf0 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
21d00 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
21d10 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
21d20 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
21d30 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
21d40 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
21d50 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
21d60 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
21d70 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
21d80 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21d90 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21da0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21db0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21dc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21dd0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
21de0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21df0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21e00 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
21e10 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
21e20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21e30 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
21e40 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21e50 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
21e60 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
21e70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
21e80 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  o.  );.  release
21e90 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
21ea0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
21eb0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
21ec0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
21ed0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
21ee0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
21ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
21f00 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
21f10 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
21f20 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
21f30 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
21f40 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
21f50 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
21f60 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
21f70 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
21f80 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
21f90 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
21fa0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
21fb0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
21fc0 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
21fd0 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
21fe0 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
21ff0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
22000 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
22010 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
22020 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
22030 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
22040 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
22050 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
22060 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
22070 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
22080 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
22090 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
220a0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
220b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
220c0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
220d0 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
220e0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
220f0 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
22100 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
22110 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
22120 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
22130 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
22140 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
22150 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
22160 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
22170 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
22180 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
22190 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
221a0 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
221b0 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
221c0 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
221d0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
221e0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
221f0 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
22200 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
22210 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
22220 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
22230 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
22240 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
22250 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
22260 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
22270 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
22280 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
22290 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
222a0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
222b0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
222c0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
222d0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
222e0 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
222f0 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
22300 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
22310 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
22320 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
22330 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22340 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
22350 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22360 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
22370 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
22380 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
22390 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
223a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
223b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
223c0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
223d0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
223e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
223f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
22400 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
22410 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
22420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
22430 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
22440 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
22450 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
22460 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
22470 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
22480 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
22490 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
224a0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
224b0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
224c0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
224d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
224e0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
224f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
22500 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
22510 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
22520 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
22530 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
22540 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
22550 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
22560 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
22570 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
22580 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  i]);.    }.    p
22590 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
225a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
225b0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
225c0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
225d0 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
225e0 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  age[0]);.    if(
225f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22600 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
22610 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
22620 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
22630 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22640 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
22650 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43  0;..    /* If pC
22660 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
22670 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
22680 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
22690 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
226a0 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65  r.    ** expecte
226b0 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
226c0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
226d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
226e0 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a  KeyInfo is.    *
226f0 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
22700 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
22710 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
22720 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
22730 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  se,.    ** retur
22740 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
22750 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20  UPT error.  */. 
22760 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22770 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
22780 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61  ey==1 || pCur->a
22790 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
227a0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ==0 );.    if( (
227b0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
227c0 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  0)!=pCur->apPage
227d0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [0]->intKey ){. 
227e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
227f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22800 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
22810 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
22820 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66   root page is of
22830 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
22840 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  e. This must be 
22850 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73  the.  ** case as
22860 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69   the call to thi
22870 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
22880 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d  loaded the root-
22890 70 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a  page (either.  *
228a0 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61  * this call or a
228b0 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61   previous invoca
228c0 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65  tion) would have
228d0 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
228e0 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68  tion .  ** if th
228f0 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72  e assumption wer
22900 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
22910 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
22920 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73  le for the flags
22930 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68   .  ** byte to h
22940 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
22950 64 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72  d while this cur
22960 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  sor is holding a
22970 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20   reference.  ** 
22980 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f  to the page.  */
22990 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
229a0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
229b0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
229c0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
229d0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
229e0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20  Root->isInit && 
229f0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
22a00 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)==pRoot->intK
22a10 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61  ey );..  pCur->a
22a20 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
22a30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
22a40 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
22a50 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
22a60 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
22a70 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
22a80 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
22a90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
22aa0 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
22ab0 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
22ac0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
22ad0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22ae0 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
22af0 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
22b00 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
22b10 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
22b20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
22b30 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
22b40 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
22b50 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
22b60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22b70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
22b80 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pRoot->nCell>0)?
22b90 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
22ba0 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
22bb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22bc0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
22bd0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
22be0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
22bf0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
22c00 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
22c10 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
22c20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
22c30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
22c40 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
22c50 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
22c60 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
22c70 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
22c80 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
22c90 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
22ca0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
22cb0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
22cc0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
22cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22ce0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
22cf0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
22d00 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
22d10 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
22d20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22d30 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
22d40 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
22d50 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
22d60 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
22d70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
22d80 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
22d90 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
22da0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
22db0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
22dc0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
22dd0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
22de0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22df0 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
22e00 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
22e10 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
22e20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22e30 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
22e40 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
22e50 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
22e60 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
22e70 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
22e80 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
22e90 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
22ea0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
22eb0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
22ec0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
22ed0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
22ee0 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
22ef0 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
22f00 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
22f10 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
22f20 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
22f30 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
22f40 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
22f50 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
22f60 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
22f70 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
22f80 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
22f90 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
22fa0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
22fb0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
22fc0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
22fd0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
22fe0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
22ff0 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
23000 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
23010 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
23020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
23030 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
23040 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
23050 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23060 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23070 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23080 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23090 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
230a0 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
230b0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
230c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
230d0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
230e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
230f0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
23100 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
23110 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
23120 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
23130 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
23140 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
23150 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
23160 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
23170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
23180 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23190 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
231a0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
231b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
231c0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
231d0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
231e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
231f0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23200 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
23210 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
23220 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
23230 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
23240 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
23250 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
23260 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
23270 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
23280 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
23290 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
232a0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
232b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
232c0 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
232d0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
232e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
232f0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23300 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23310 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23320 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
23330 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
23340 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
23350 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
23360 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
23380 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23390 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
233a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
233b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
233c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
233d0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
233e0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
233f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23400 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23410 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
23420 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
23430 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
23440 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
23450 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
23460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23470 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
23480 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
23490 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
234a0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
234b0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
234c0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
234d0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
234e0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
234f0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
23500 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
23510 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
23520 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
23530 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
23540 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
23550 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
23560 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
23570 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23580 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23590 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
235a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
235b0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
235c0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
235d0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
235e0 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
235f0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
23600 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
23610 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
23620 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
23630 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c  ate && pCur->atL
23640 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ast ){.#ifdef SQ
23650 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
23660 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
23670 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
23680 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
23690 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
236a0 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
236b0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
236c0 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
236d0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
236e0 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
236f0 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
23700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
23710 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
23720 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
23730 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
23740 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23750 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23760 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]==pCur->apPag
23770 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23780 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
23790 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
237a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
237b0 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
237c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
237d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
237e0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
237f0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
23800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23810 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
23820 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
23830 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23840 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23850 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
23860 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
23870 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
23880 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
23890 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
238a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
238b0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
238c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
238d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
238e0 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  r);.      pCur->
238f0 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c  atLast = rc==SQL
23900 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20  ITE_OK ?1:0;.   
23910 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23920 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
23930 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
23940 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
23950 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
23960 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
23970 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
23980 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
23990 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
239a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
239b0 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
239c0 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
239d0 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
239e0 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
239f0 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
23a00 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
23a10 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
23a20 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
23a30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
23a40 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
23a50 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
23a60 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
23a70 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
23a80 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
23a90 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
23aa0 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
23ab0 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
23ac0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
23ad0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
23ae0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
23af0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
23b00 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
23b10 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
23b20 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
23b30 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
23b40 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
23b50 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
23b60 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
23b70 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
23b80 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
23b90 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
23ba0 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
23bb0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
23bc0 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
23bd0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
23be0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
23bf0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
23c00 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
23c10 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
23c30 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
23c40 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
23c50 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
23c60 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
23c70 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
23c80 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
23c90 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
23ca0 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
23cb0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
23cc0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
23cd0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
23ce0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
23cf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23d00 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
23d10 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
23d20 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
23d30 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
23d40 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
23d50 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
23d60 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
23d80 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
23d90 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
23da0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23db0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
23dc0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
23dd0 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
23de0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
23df0 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
23e00 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
23e10 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
23e20 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
23e30 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
23e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23e50 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
23e60 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
23e70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
23e80 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
23e90 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
23ea0 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
23eb0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
23ec0 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
23ed0 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
23ee0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  /.){.  int rc;..
23ef0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23f00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
23f20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
23f30 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
23f40 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
23f50 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
23f60 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
23f70 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
23f80 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
23f90 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
23fa0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
23fb0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
23fc0 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
23fd0 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
23fe0 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
23ff0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
24000 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
24010 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
24020 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24030 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  && pCur->validNK
24040 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ey .   && pCur->
24050 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
24060 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
24070 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
24080 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
24090 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
240a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
240b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
240c0 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26  ( pCur->atLast &
240d0 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
240e0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
240f0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
24100 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24110 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
24120 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
24130 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
24140 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
24150 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
24160 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
24170 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
24180 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24190 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
241a0 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ge]->isInit );. 
241b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
241c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
241d0 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70  e]->nCell>0 || p
241e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
241f0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
24200 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
24210 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
24220 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
24230 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
24240 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24250 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
24260 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
24270 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24280 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
24290 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
242a0 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
242b0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
242c0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20   int lwr, upr;. 
242d0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
242e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
242f0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24300 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
24310 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
24320 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
24330 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
24340 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
24350 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
24360 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
24370 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
24380 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
24390 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
243a0 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
243b0 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
243c0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
243d0 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
243e0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
243f0 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
24400 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
24410 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
24420 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
24430 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
24440 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
24450 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
24460 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
24470 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
24480 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
24490 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
244a0 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
244b0 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
244c0 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
244d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
244e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
244f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24500 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
24510 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
24520 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
24530 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
24540 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73 52  1;.    if( biasR
24550 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
24560 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24570 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70  iPage] = (u16)up
24580 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
24590 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
245a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
245b0 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32  u16)((upr+lwr)/2
245c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
245d0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  (;;){.      int 
245e0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
245f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  x[pCur->iPage]; 
24600 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72  /* Index of curr
24610 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
24620 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70  e */.      u8 *p
24630 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24650 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
24660 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
24670 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75  ge */..      pCu
24680 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
24690 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  0;.      pCell =
246a0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
246b0 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
246c0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
246d0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
246e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
246f0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
24700 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
24710 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
24720 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b        u32 dummy;
24730 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
24740 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
24750 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20  pCell, dummy);. 
24760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24770 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
24780 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
24790 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
247a0 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
247b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
247c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
247d0 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  se if( nCellKey<
247e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
247f0 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20      c = -1;.    
24800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24810 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
24820 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a  llKey>intKey );.
24830 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
24840 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24850 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
24860 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Key = 1;.       
24870 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
24880 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
24890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
248a0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
248b0 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
248c0 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
248d0 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
248e0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
248f0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
24900 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
24910 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
24920 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
24930 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
24940 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
24950 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
24960 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
24970 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
24980 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
24990 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
249a0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
249b0 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
249c0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
249d0 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
249e0 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
249f0 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
24a00 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
24a10 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
24a20 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
24a30 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
24a40 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
24a50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
24a60 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
24a70 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24a80 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d       int nCell =
24a90 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
24aa0 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c 20 26     if( !(nCell &
24ab0 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c   0x80) && nCell<
24ac0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
24ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
24ae0 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
24af0 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
24b00 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
24b10 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
24b20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
24b30 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
24b40 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
24b50 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
24b60 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
24b70 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
24b80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  */.          c =
24b90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
24ba0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
24bb0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
24bc0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
24bd0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
24be0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
24bf0 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
24c00 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
24c10 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
24c20 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
24c30 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
24c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
24c50 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
24c60 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
24c70 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
24c80 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
24c90 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
24ca0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
24cb0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
24cc0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
24cd0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
24ce0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
24cf0 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
24d00 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
24d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24d20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
24d30 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
24d40 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
24d50 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
24d60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
24d70 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
24d80 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
24d90 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
24da0 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
24db0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
24dc0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
24dd0 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
24de0 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
24df0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
24e00 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
24e10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
24e20 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
24e30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76  . */.          v
24e40 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
24e50 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
24e60 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
24e70 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
24e80 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
24e90 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
24ea0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
24eb0 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
24ec0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
24ed0 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
24ee0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
24ef0 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
24f00 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
24f10 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20  loc( nCell );.  
24f20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
24f30 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lKey==0 ){.     
24f40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24f50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
24f60 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
24f70 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
24f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24f90 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
24fa0 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
24fb0 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
24fc0 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b  r*)pCellKey, 0);
24fd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
24fe0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
24ff0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
25000 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
25010 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
25020 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
25030 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
25040 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
25050 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
25060 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
25070 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
25080 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
25090 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
250a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
250b0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
250c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
250d0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
250e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
250f0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
25100 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c           upr = l
25110 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  wr - 1;.        
25120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
25130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25140 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
25150 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25160 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
25170 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
25180 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
25190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
251a0 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
251b0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
251c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
251d0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
251e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
251f0 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20   lwr>upr ){.    
25200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25210 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61   }.      pCur->a
25220 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25230 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75  ] = (u16)((lwr+u
25240 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  pr)/2);.    }.  
25250 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
25260 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65  pr+1 );.    asse
25270 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
25280 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
25290 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
252a0 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20    chldPg = 0;.  
252b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
252c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
252d0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
252e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
252f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
25300 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
25310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
25320 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
25330 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
25340 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
25350 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29   if( chldPg==0 )
25360 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25370 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25380 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
25390 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
253a0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
253b0 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
253c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
253d0 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
253e0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
253f0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
25400 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25410 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
25420 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25430 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
25440 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
25450 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
25460 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
25470 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
25480 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
25490 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  ish;.  }.moveto_
254a0 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e  finish:.  return
254b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
254c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
254d0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
254e0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
254f0 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
25500 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
25510 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
25520 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
25530 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
25540 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
25550 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
25560 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
25570 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
25580 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
25590 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
255a0 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
255b0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
255c0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
255d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
255e0 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
255f0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
25600 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
25610 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
25620 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
25630 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
25640 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
25650 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
25660 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
25670 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
25680 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
25690 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
256a0 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
256b0 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
256c0 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
256d0 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
256e0 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
256f0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
25700 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
25710 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
25720 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
25730 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
25740 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
25750 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
25760 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
25770 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
25780 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
25790 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
257a0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
257b0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
257c0 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
257d0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
257e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
257f0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
25800 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
25810 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25820 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
25830 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25840 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
25850 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
25860 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
25870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25880 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
25890 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
258a0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  pRes!=0 );.  if(
258b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
258c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
258d0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
258e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
258f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
25900 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
25910 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
25920 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
25930 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
25940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25950 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
25960 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50  pNext = 0;..  pP
25970 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
25980 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
25990 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
259a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
259b0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
259c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
259d0 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70    assert( idx<=p
259e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
259f0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
25a00 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
25a10 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
25a20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
25a30 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
25a40 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
25a50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
25a60 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
25a70 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
25a80 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
25a90 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
25aa0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
25ab0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
25ac0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
25ad0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
25ae0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
25af0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25b00 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
25b10 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
25b20 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
25b30 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
25b40 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
25b50 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
25b60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25b70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
25b80 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
25b90 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
25ba0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25bb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25bc0 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
25bd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25be0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
25bf0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
25c00 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
25c10 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
25c20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
25c30 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
25c40 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
25c50 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
25c60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
25c70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
25c80 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
25c90 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
25ca0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
25cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
25cc0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
25cd0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
25ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
25cf0 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
25d00 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
25d10 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
25d20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
25d30 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
25d40 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
25d50 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
25d60 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
25d70 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
25d80 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
25d90 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
25da0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
25db0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
25dc0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
25dd0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
25de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
25df0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
25e00 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
25e10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
25e20 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
25e30 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25e40 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25e50 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
25e60 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
25e70 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
25e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
25ea0 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
25eb0 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
25ec0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
25ed0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
25ee0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
25ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25f00 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
25f10 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
25f20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
25f30 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
25f40 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
25f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
25f60 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
25f70 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
25f80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25f90 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
25fa0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
25fb0 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
25fc0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
25fd0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
25fe0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25ff0 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
26000 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
26010 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
26020 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
26030 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
26040 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26050 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
26060 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
26070 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
26080 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
26090 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
260a0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
260b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
260c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
260d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
260e0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
260f0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
26100 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26110 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
26120 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
26130 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
26140 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
26150 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
26160 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
26170 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
26180 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
26190 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
261a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
261b0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
261c0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
261d0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
261e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
261f0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
26200 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
26210 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26220 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
26230 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
26240 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
26250 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
26260 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
26270 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
26280 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
26290 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
262a0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
262b0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
262c0 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
262d0 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
262e0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
262f0 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
26300 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
26310 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
26320 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
26330 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
26340 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
26350 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
26360 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
26370 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
26380 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
26390 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
263a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
263b0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
263c0 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
263d0 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
263e0 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
263f0 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
26400 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
26410 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
26420 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
26430 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
26440 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
26450 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
26460 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
26470 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
26480 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
26490 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
264a0 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
264b0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
264c0 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
264d0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
264e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
264f0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
26500 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
26510 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
26520 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
26530 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
26540 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
26550 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
26560 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
26570 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
26580 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
26590 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
265a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
265b0 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
265c0 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
265d0 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
265e0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
265f0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
26600 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
26610 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
26620 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
26630 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
26640 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
26650 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
26660 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
26670 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
26680 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
26690 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
266a0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
266b0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
266c0 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
266d0 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
266e0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
266f0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
26700 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
26710 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
26720 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
26730 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
26740 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
26750 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
26760 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
26770 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
26780 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
26790 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
267a0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
267b0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
267c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
267d0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
267e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
267f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
26800 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
26810 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
26820 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
26830 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e  ecount(pBt);.  n
26840 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
26850 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
26860 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
26870 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
26880 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
26890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
268a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
268b0 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
268c0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
268d0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
268e0 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
268f0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
26900 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
26910 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
26920 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
26930 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
26940 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
26950 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
26960 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
26970 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
26980 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
26990 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
269a0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
269b0 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
269c0 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
269d0 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
269e0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
269f0 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
26a00 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
26a10 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
26a20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
26a30 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
26a40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26a50 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61  CUUM.    if( exa
26a60 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78  ct && nearby<=mx
26a70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38  Page ){.      u8
26a80 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73   eType;.      as
26a90 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
26aa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26ab0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26ac0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
26ad0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
26ae0 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
26af0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
26b00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26b10 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
26b20 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
26b30 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
26b40 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
26b50 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65       *pPgno = ne
26b60 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  arby;.    }.#end
26b70 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
26b80 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
26b90 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
26ba0 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
26bb0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
26bc0 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
26bd0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
26be0 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
26bf0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
26c00 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
26c10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
26c20 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
26c30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
26c40 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
26c50 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
26c60 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
26c70 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
26c80 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
26c90 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
26ca0 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
26cb0 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
26cc0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
26cd0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
26ce0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
26cf0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
26d00 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
26d10 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
26d20 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
26d30 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a  s located..    *
26d40 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
26d50 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
26d60 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
26d70 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
26d80 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
26d90 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
26da0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
26db0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26dc0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
26dd0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26de0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
26df0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
26e00 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
26e10 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
26e20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
26e30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26e40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
26e50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
26e60 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
26e70 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
26e80 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
26e90 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
26ea0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
26eb0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
26ec0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
26ed0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
26ee0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b        }..      k
26ef0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
26f00 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
26f10 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
26f20 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
26f30 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
26f40 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
26f50 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
26f60 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
26f70 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
26f80 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
26f90 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
26fa0 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
26fb0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
26fc0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
26fd0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
26fe0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
26ff0 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
27000 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27010 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
27020 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
27030 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
27040 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27050 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27060 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27070 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
27080 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
27090 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
270a0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
270b0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
270c0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
270d0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
270e0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
270f0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
27100 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
27110 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
27120 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
27130 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
27140 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
27150 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
27160 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
27170 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
27180 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
27190 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
271a0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
271b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
271c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
271d0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
271e0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
271f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27200 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
27210 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
27220 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
27230 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
27240 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
27250 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
27260 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
27270 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
27280 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
27290 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
272a0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
272b0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
272c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
272d0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
272e0 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
272f0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
27300 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
27310 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
27320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
27330 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
27340 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
27350 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27360 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27370 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27390 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
273a0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
273b0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
273c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
273d0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
273e0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
273f0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
27400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27410 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27420 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
27430 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
27440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27470 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
27480 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
27490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
274a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
274b0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
274c0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
274d0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
274e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
274f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
27500 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
27510 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
27520 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
27530 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
27540 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
27550 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
27560 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
27570 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
27580 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
27590 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
275a0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
275b0 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
275c0 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
275d0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
275e0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
275f0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
27600 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
27610 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
27620 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
27630 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27640 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27650 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
27660 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
27670 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
27680 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
27690 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
276a0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
276b0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
276c0 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
276d0 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
276e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
276f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
27710 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
27720 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
27730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
27740 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27750 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
27760 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
27770 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27790 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
277a0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
277b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
277c0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
277d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
277e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
277f0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
27800 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
27810 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
27820 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
27830 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
27840 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
27850 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
27860 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
27870 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
27880 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
27890 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
278a0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
278b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
278c0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
278d0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
278e0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
278f0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
27900 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
27910 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
27920 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
27930 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
27940 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
27950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27970 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
27980 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
27990 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
279a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
279b0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
279c0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
279d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
279e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
279f0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
27a00 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
27a10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
27a30 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
27a40 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
27a50 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
27a60 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
27a70 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
27a80 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
27a90 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
27aa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
27ab0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
27ac0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
27ad0 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
27ae0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
27af0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
27b00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
27b10 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
27b20 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
27b30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
27b40 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
27b50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
27b60 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
27b70 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
27b80 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
27b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
27ba0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
27bb0 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
27bc0 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
27bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
27be0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
27bf0 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79     dist = get4by
27c00 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
27c10 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
27c20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64    if( dist<0 ) d
27c30 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20  ist = -dist;.   
27c40 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
27c50 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
27c60 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
27c70 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
27c80 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
27c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27ca0 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64  ( d2<0 ) d2 = -d
27cb0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  2;.            i
27cc0 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
27ce0 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
27cf0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
27d00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27d10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27d30 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
27d40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
27d50 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
27d60 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
27d70 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
27d80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
27d90 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
27da0 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
27db0 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
27dc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27dd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27de0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27df0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27e10 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
27e20 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
27e30 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
27e40 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
27e50 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
27e60 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
27e70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
27e80 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
27e90 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
27ea0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
27eb0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
27ec0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
27ee0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
27ef0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
27f00 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
27f10 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
27f20 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
27f30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27f40 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
27f50 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
27f60 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
27f70 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
27f80 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
27f90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27fa0 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
27fb0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
27fc0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
27fd0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
27fe0 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ble(pTrunk->pDbP
27ff0 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
28000 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
28010 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
28020 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a  t(pBt, *pPgno);.
28030 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
28040 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
28050 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
28060 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
28070 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
28080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28090 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
280a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
280b0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
280c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
280d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
280e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
280f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
28100 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
28110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28120 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
28130 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
28140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28150 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
28160 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
28170 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
28180 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
28190 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
281a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
281b0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
281c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
281d0 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65  , so create a ne
281e0 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20  w page at the.  
281f0 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
28200 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  file */.    rc =
28210 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28220 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
28230 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
28240 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28250 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
28260 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
28270 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
28280 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
28290 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
282a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
282b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
282c0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
282d0 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
282e0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
282f0 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
28300 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
28310 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
28320 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
28330 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
28340 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
28350 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
28360 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
28370 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
28380 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
28390 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
283a0 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
283b0 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
283c0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
283d0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
283e0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
283f0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
28400 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
28410 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
28420 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
28430 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
28440 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
28450 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
28460 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
28470 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
28480 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
28490 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  tPage(pBt, pBt->
284a0 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 31 29 3b  nPage, &pPg, 1);
284b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
284c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
284d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
284e0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
284f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
28500 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
28510 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
28520 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
28530 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
28540 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
28550 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
28560 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
28570 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
28580 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
28590 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
285a0 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
285b0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
285c0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
285d0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
285e0 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
285f0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
28600 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
28610 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
28620 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
28630 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
28640 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
28650 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28670 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
28680 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
28690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
286a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
286b0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
286c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
286d0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
286e0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
286f0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
28700 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
28710 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
28720 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
28730 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
28740 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
28750 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
28760 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
28770 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
28780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28790 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
287a0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
287b0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
287c0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
287d0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
287e0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
287f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28800 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
28810 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
28820 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
28830 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
28840 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28850 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
28860 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
28870 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
28880 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
28890 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
288a0 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
288b0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
288c0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
288d0 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
288e0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
288f0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
28900 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
28910 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
28920 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
28930 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
28940 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
28950 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
28960 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
28970 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
28980 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
28990 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
289a0 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
289b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
289c0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
289d0 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
289e0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
289f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
28a00 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
28a10 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
28a20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
28a30 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
28a40 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
28a50 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
28a60 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
28a70 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
28a80 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
28a90 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
28aa0 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
28ab0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
28ac0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28ad0 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
28ae0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
28af0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
28b20 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
28b30 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
28b40 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
28b50 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
28b60 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
28b70 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
28b80 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
28b90 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
28ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
28bb0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
28bc0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
28bd0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28c00 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
28c10 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c30 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
28c40 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
28c50 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
28c60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28c70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
28c80 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
28c90 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
28ca0 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
28cb0 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
28cc0 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
28cd0 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
28ce0 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
28cf0 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
28d00 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
28d10 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
28d20 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
28d30 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
28d40 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
28d50 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
28d60 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
28d70 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
28d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28d90 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
28da0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
28db0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
28dc0 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
28dd0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
28de0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
28df0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
28e00 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
28e10 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28  nFree+1);..  if(
28e20 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65   pBt->secureDele
28e30 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  te ){.    /* If 
28e40 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
28e50 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
28e60 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
28e70 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
28e80 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
28e90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
28ea0 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
28eb0 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26     if( (!pPage &
28ec0 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65  & ((rc = btreeGe
28ed0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
28ee0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30  , &pPage, 0))!=0
28ef0 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
28f00 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
28f10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28f20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
28f30 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
28f40 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
28f50 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
28f60 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
28f70 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
28f80 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
28f90 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
28fa0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
28fb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
28fc0 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
28fd0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
28fe0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
28ff0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
29000 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
29010 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
29020 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
29030 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
29040 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
29050 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
29060 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
29070 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
29080 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
29090 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
290a0 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
290b0 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
290c0 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
290d0 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
290e0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
290f0 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
29100 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
29110 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
29120 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
29130 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
29140 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
29150 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
29160 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
29170 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
29180 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
29190 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
291a0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
291b0 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
291c0 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
291d0 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
291e0 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
291f0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
29200 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
29210 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
29220 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
29230 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
29240 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
29250 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
29260 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
29270 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
29280 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
29290 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
292a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
292b0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
292c0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
292d0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
292e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
292f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29300 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
29310 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
29320 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
29330 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
29340 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29350 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
29360 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
29370 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
29380 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
29390 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
293a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
293b0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
293c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
293d0 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
293e0 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
293f0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
29400 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
29410 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
29420 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
29430 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
29440 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
29450 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
29460 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
29470 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
29480 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
29490 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
294a0 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
294b0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
294c0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
294d0 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
294e0 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
294f0 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
29500 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
29510 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
29520 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
29530 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
29540 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
29550 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
29560 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
29570 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
29580 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
29590 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
295a0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
295b0 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
295c0 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
295d0 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
295e0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
295f0 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
29600 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
29610 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
29620 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
29630 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
29640 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
29650 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
29660 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
29670 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
29680 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
29690 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
296a0 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
296b0 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
296c0 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
296d0 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
296e0 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
296f0 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
29700 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
29710 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
29720 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
29730 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
29740 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
29750 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
29760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
29770 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
29780 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
29790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
297a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
297b0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
297c0 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
297d0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
297e0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
297f0 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
29800 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
29810 69 66 28 20 70 50 61 67 65 20 26 26 20 21 70 42  if( pPage && !pB
29820 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
29830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
29840 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
29850 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
29860 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
29870 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
29880 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
29890 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
298a0 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
298b0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
298c0 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
298d0 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
298e0 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
298f0 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
29900 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
29910 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
29920 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
29930 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
29940 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
29950 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
29960 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
29970 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
29980 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
29990 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
299a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
299b0 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
299c0 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
299d0 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
299e0 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
299f0 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
29a00 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
29a10 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
29a20 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
29a30 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
29a40 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
29a50 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
29a60 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
29a70 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
29a80 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
29a90 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
29aa0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
29ab0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
29ac0 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
29ad0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
29ae0 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
29af0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29b00 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
29b10 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
29b20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
29b30 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
29b40 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
29b50 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
29b60 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
29b70 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
29b80 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
29b90 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29ba0 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
29bb0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
29bc0 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
29bd0 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
29be0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
29bf0 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
29c00 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
29c10 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
29c20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
29c30 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
29c40 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
29c50 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
29c60 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
29c70 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
29c80 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
29c90 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
29ca0 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
29cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29cc0 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
29cd0 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
29ce0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
29cf0 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
29d00 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
29d10 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
29d20 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
29d30 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
29d40 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
29d50 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
29d60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
29d70 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
29d80 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
29d90 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
29da0 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
29db0 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
29dc0 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
29dd0 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
29de0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
29df0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29e00 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
29e10 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61  ex) );.  btreePa
29e20 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
29e30 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
29e40 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
29e50 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  rflow==0 ){.    
29e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29e70 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
29e80 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
29e90 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
29ea0 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
29eb0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
29ec0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
29ed0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
29ee0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
29ef0 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
29f00 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
29f10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
29f20 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
29f30 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
29f40 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
29f50 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
29f60 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
29f70 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
29f80 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
29f90 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
29fa0 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
29fb0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
29fc0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
29fd0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
29fe0 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
29ff0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2a000 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
2a010 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
2a020 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2a030 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
2a040 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
2a050 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
2a060 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
2a070 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
2a080 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
2a090 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
2a0a0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2a0b0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2a0c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a0d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2a0e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
2a0f0 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
2a100 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2a110 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
2a120 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
2a130 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2a140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2a150 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
2a160 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
2a170 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2a180 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
2a190 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
2a1a0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2a1b0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
2a1c0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
2a1d0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2a1e0 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
2a1f0 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
2a200 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
2a210 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
2a220 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
2a230 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
2a240 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
2a250 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
2a260 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
2a270 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
2a280 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
2a290 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2a2a0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
2a2b0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
2a2c0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
2a2d0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2a2e0 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
2a2f0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2a300 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
2a310 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
2a320 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
2a330 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
2a340 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
2a350 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
2a360 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
2a370 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
2a380 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2a390 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
2a3a0 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
2a3b0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
2a3c0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
2a3d0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
2a3e0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
2a3f0 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
2a400 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
2a410 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
2a420 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
2a430 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
2a440 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2a450 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2a460 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2a470 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2a480 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
2a490 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
2a4a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2a4b0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
2a4c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a4d0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
2a4e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a4f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a500 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
2a510 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
2a520 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a530 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2a540 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
2a550 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
2a560 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
2a570 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
2a580 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
2a590 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
2a5a0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
2a5b0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
2a5c0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
2a5d0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
2a5e0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
2a5f0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
2a600 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2a610 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
2a620 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
2a630 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
2a640 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
2a650 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2a660 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
2a670 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
2a680 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
2a690 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
2a6a0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
2a6b0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
2a6c0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
2a6d0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
2a6e0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
2a6f0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
2a700 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
2a710 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
2a720 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
2a730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a740 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
2a750 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2a760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a770 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2a780 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
2a790 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2a7a0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
2a7b0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2a7c0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
2a7d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2a7e0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2a7f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2a800 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2a810 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
2a820 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
2a830 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a850 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
2a860 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
2a870 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
2a880 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a8a0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
2a8b0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
2a8c0 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
2a8d0 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
2a8e0 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
2a8f0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
2a900 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
2a910 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
2a920 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
2a930 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
2a940 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
2a950 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2a960 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
2a970 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2a980 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
2a990 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
2a9a0 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
2a9b0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
2a9c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a9d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2a9e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2a9f0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2aa00 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2aa10 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2aa20 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2aa30 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2aa40 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2aa50 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2aa60 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2aa70 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2aa80 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2aa90 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2aaa0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2aab0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2aac0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2aad0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2aae0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2aaf0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2ab00 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2ab10 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
2ab20 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2ab30 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
2ab40 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
2ab50 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
2ab60 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
2ab70 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
2ab80 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2ab90 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
2aba0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
2abb0 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
2abc0 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
2abd0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
2abe0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
2abf0 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65  )&nKey);.  btree
2ac00 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2ac10 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2ac20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2ac30 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
2ac40 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2ac50 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
2ac60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2ac70 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e  o.nData==(u32)(n
2ac80 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20  Data+nZero) );. 
2ac90 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
2aca0 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
2acb0 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
2acc0 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
2acd0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2ace0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2acf0 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2ad00 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2ad10 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2ad20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2ad30 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2ad40 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2ad50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2ad60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2ad70 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2ad80 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
2ad90 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
2ada0 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
2adb0 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
2adc0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
2add0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
2ade0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
2adf0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
2ae00 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
2ae10 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
2ae20 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
2ae30 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2ae40 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2ae50 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2ae60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ae70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2ae80 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2ae90 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
2aea0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
2aeb0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2aec0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2aed0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2aee0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
2aef0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
2af00 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
2af10 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
2af20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
2af30 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
2af40 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
2af50 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2af60 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
2af70 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2af80 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2af90 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2afa0 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
2afb0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
2afc0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2afd0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2afe0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
2aff0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2b000 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2b010 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
2b020 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
2b030 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2b040 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
2b050 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
2b060 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
2b070 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
2b080 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
2b090 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
2b0a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
2b0b0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
2b0c0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
2b0d0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
2b0e0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
2b0f0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2b100 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
2b110 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
2b120 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
2b130 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
2b140 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
2b150 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
2b160 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
2b170 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
2b180 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
2b190 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
2b1a0 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
2b1b0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2b1c0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
2b1d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2b1e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2b1f0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2b200 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
2b210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b220 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
2b230 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
2b240 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
2b250 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
2b260 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2b270 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
2b280 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
2b290 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
2b2a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2b2b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2b2c0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
2b2d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2b2e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2b2f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2b300 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2b310 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b320 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2b330 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2b340 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2b350 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2b360 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2b370 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2b380 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2b390 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2b3a0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2b3b0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2b3c0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2b3d0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2b3e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2b3f0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2b400 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2b410 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2b420 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2b430 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2b440 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2b450 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
2b460 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2b470 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2b480 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
2b490 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
2b4a0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2b4b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2b4c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2b4d0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2b4e0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2b4f0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2b500 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2b510 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
2b520 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2b530 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2b540 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
2b550 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
2b560 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
2b570 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2b580 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
2b590 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
2b5a0 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
2b5b0 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
2b5c0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2b5d0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
2b5e0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
2b5f0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
2b600 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
2b610 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
2b620 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2b630 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
2b640 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
2b650 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2b660 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2b670 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2b680 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2b690 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2b6a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
2b6b0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2b6c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2b6d0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2b6e0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2b6f0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
2b700 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
2b710 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2b720 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2b730 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
2b740 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2b750 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
2b760 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
2b770 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
2b780 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
2b790 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2b7a0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2b7b0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2b7c0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2b7d0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2b7e0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
2b7f0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
2b800 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
2b810 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
2b820 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2b830 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
2b840 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2b850 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
2b860 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
2b870 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2b880 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
2b890 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
2b8a0 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
2b8b0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
2b8c0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
2b8d0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
2b8e0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2b8f0 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
2b900 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
2b910 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2b920 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
2b930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b940 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2b950 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
2b960 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
2b970 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
2b980 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
2b990 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2b9a0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
2b9b0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
2b9c0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
2b9d0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
2b9e0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
2b9f0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
2ba00 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
2ba10 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
2ba20 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
2ba30 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
2ba40 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
2ba50 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
2ba60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2ba70 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
2ba80 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
2ba90 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2baa0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
2bab0 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
2bac0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2bad0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2bae0 72 20 2a 2f 0a 20 20 75 33 32 20 70 63 3b 20 20  r */.  u32 pc;  
2baf0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2bb00 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
2bb10 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
2bb20 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
2bb30 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
2bb40 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
2bb50 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
2bb60 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
2bb70 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
2bb80 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
2bb90 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2bba0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2bbb0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
2bbc0 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
2bbd0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
2bbe0 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
2bbf0 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
2bc00 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
2bc10 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2bc20 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
2bc30 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2bc40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
2bc50 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
2bc60 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
2bc70 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2bc80 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2bc90 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2bca0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2bcb0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2bcc0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2bcd0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2bce0 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
2bcf0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
2bd00 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b  Offset + 2*idx];
2bd10 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
2bd20 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
2bd30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2bd40 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
2bd50 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
2bd60 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
2bd70 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
2bd80 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2bd90 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
2bda0 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
2bdb0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
2bdc0 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
2bdd0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2bde0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
2bdf0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2be00 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
2be10 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
2be20 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
2be30 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
2be40 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
2be50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2be60 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69    for(i=idx+1; i
2be70 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
2be80 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20  ++, ptr+=2){.   
2be90 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d   ptr[0] = ptr[2]
2bea0 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70  ;.    ptr[1] = p
2beb0 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  tr[3];.  }.  pPa
2bec0 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70  ge->nCell--;.  p
2bed0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2bee0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
2bef0 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
2bf00 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a  ree += 2;.}../*.
2bf10 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
2bf20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
2bf30 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
2bf40 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
2bf50 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
2bf60 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
2bf70 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
2bf80 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
2bf90 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
2bfa0 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
2bfb0 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
2bfc0 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
2bfd0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2bfe0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
2bff0 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
2c000 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
2c010 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
2c020 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
2c030 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
2c040 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
2c050 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
2c060 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
2c070 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
2c080 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
2c090 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
2c0a0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
2c0b0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
2c0c0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
2c0d0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
2c0e0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
2c0f0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
2c100 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
2c110 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
2c120 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
2c130 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
2c140 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
2c150 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
2c160 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
2c170 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2c180 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
2c190 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
2c1a0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
2c1b0 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
2c1c0 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
2c1d0 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
2c1e0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
2c1f0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
2c200 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
2c210 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
2c220 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2c230 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
2c240 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2c250 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
2c260 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
2c270 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
2c280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2c290 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
2c2a0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
2c2b0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
2c2c0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2c2d0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2c2e0 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
2c2f0 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
2c300 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
2c310 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
2c320 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
2c330 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
2c340 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
2c350 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
2c360 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
2c370 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  d,      /* If no
2c380 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20  n-zero, replace 
2c390 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69  first 4 bytes wi
2c3a0 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f  th this value */
2c3b0 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20  .  int *pRC     
2c3c0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64       /* Read and
2c3d0 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f   write return co
2c3e0 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  de from here */.
2c3f0 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30  ){.  int idx = 0
2c400 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ;      /* Where 
2c410 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
2c420 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
2c430 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
2c440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2c450 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2c460 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
2c470 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
2c480 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
2c490 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
2c4a0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
2c4b0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
2c4c0 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
2c4d0 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
2c4e0 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
2c4f0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  d */.  int cellO
2c500 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
2c510 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
2c520 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2c530 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
2c540 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
2c550 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2c560 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
2c570 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
2c580 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
2c590 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
2c5a0 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
2c5b0 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b  [] */..  int nSk
2c5c0 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34  ip = (iChild ? 4
2c5d0 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70   : 0);..  if( *p
2c5e0 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
2c5f0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
2c600 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
2c610 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2c620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2c630 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
2c640 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
2c650 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  && MX_CELL(pPage
2c660 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
2c670 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2c680 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
2c690 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f  aySize(pPage->aO
2c6a0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2c6b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2c6c0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2c6d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
2c6e0 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
2c6f0 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
2c700 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
2c710 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
2c720 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
2c730 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
2c740 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
2c750 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
2c760 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
2c770 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
2c780 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
2c790 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
2c7a0 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
2c7b0 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
2c7c0 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
2c7d0 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
2c7e0 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
2c7f0 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
2c800 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
2c810 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
2c820 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
2c830 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
2c840 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
2c850 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
2c860 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
2c870 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
2c880 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
2c890 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
2c8a0 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
2c8b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
2c8c0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
2c8d0 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
2c8e0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
2c8f0 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
2c900 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
2c910 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
2c920 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2c930 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
2c940 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
2c950 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2c960 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
2c970 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
2c980 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
2c990 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
2c9a0 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
2c9b0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
2c9c0 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
2c9d0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
2c9e0 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20  .idx = (u16)i;. 
2c9f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
2ca00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ca10 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2ca20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2ca30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ca40 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
2ca50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2ca60 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2ca70 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2ca80 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2ca90 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2caa0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2cab0 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
2cac0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
2cad0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
2cae0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
2caf0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
2cb00 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
2cb10 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
2cb20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
2cb30 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
2cb40 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
2cb50 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
2cb60 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
2cb70 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
2cb80 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
2cb90 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
2cba0 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74  wing two propert
2cbb0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
2cbc0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
2cbd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2cbe0 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a  idx >= end+2 );.
2cbf0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
2cc00 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  sz <= pPage->pBt
2cc10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2cc20 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
2cc30 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
2cc40 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
2cc50 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
2cc60 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
2cc70 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
2cc80 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
2cc90 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2cca0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
2ccb0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
2ccc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
2ccd0 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64 61 74 61  j=end, ptr=&data
2cce0 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32  [j]; j>ins; j-=2
2ccf0 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20  , ptr-=2){.     
2cd00 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32   ptr[0] = ptr[-2
2cd10 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20  ];.      ptr[1] 
2cd20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d  = ptr[-1];.    }
2cd30 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2cd40 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
2cd50 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2cd60 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2cd70 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
2cd80 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
2cd90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2cda0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2cdb0 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
2cdc0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
2cdd0 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
2cde0 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
2cdf0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2ce00 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
2ce10 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
2ce20 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2ce30 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
2ce40 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
2ce50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ce60 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2ce70 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
2ce80 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
2ce90 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
2cea0 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
2ceb0 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
2cec0 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
2ced0 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
2cee0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
2cef0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2cf00 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
2cf10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2cf20 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
2cf30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2cf40 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
2cf50 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
2cf60 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
2cf70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2cf80 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
2cf90 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
2cfa0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2cfb0 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
2cfc0 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
2cfd0 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
2cfe0 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
2cff0 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
2d000 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
2d010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2d020 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2d030 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
2d040 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2d050 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
2d060 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
2d070 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
2d080 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2d090 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
2d0a0 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
2d0b0 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
2d0c0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2d0d0 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
2d0e0 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2d0f0 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
2d100 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
2d110 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2d120 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
2d130 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2d140 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
2d150 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2d160 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2d170 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2d180 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d190 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2d1a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d1b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2d1c0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2d1d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2d1e0 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2d1f0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2d200 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
2d210 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
2d220 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
2d230 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2d240 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2d250 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
2d260 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2d270 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
2d280 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
2d290 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
2d2a0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2d2b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d2c0 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
2d2d0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e  &data[hdr+5])==n
2d2e0 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65  Usable );..  pCe
2d2f0 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50  llptr = &data[pP
2d300 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
2d310 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  + nCell*2];.  ce
2d320 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
2d330 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
2d340 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2d350 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
2d360 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
2d370 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
2d380 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
2d390 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  r, cellbody);.  
2d3a0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
2d3b0 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
2d3c0 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a  [i], aSize[i]);.
2d3d0 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
2d3e0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
2d3f0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
2d400 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
2d410 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2d420 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
2d430 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
2d440 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2d450 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
2d460 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
2d470 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
2d480 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
2d490 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
2d4a0 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
2d4b0 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
2d4c0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2d4d0 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
2d4e0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
2d4f0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2d500 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
2d510 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
2d520 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
2d530 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2d540 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
2d550 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2d560 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
2d570 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
2d580 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
2d590 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
2d5a0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2d5b0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
2d5c0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
2d5d0 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
2d5e0 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
2d5f0 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
2d600 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
2d610 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
2d620 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
2d630 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
2d640 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
2d650 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
2d660 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
2d670 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
2d680 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
2d690 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
2d6a0 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
2d6b0 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
2d6c0 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
2d6d0 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
2d6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d6f0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2d700 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2d710 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
2d720 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
2d730 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
2d740 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
2d750 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
2d760 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d770 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2d780 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
2d790 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
2d7a0 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
2d7b0 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
2d7c0 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
2d7d0 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
2d7e0 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
2d7f0 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
2d800 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
2d810 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
2d820 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
2d830 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
2d840 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
2d850 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
2d860 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
2d870 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
2d880 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
2d890 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
2d8a0 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
2d8b0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
2d8c0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
2d8d0 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
2d8e0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
2d8f0 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
2d900 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
2d910 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
2d920 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
2d930 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
2d940 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
2d950 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
2d960 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
2d970 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
2d980 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
2d990 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
2d9a0 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
2d9b0 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
2d9c0 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
2d9d0 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
2d9e0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
2d9f0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2da00 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
2da10 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
2da20 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
2da30 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
2da40 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
2da50 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
2da60 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
2da70 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
2da80 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
2da90 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2daa0 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2dab0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
2dac0 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
2dad0 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
2dae0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2daf0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
2db00 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
2db10 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
2db20 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
2db30 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
2db40 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2db50 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
2db60 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
2db70 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
2db80 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
2db90 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
2dba0 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
2dbb0 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
2dbc0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
2dbd0 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
2dbe0 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
2dbf0 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
2dc00 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
2dc10 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
2dc20 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
2dc30 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
2dc40 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc60 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
2dc70 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2dc80 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dca0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2dcb0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
2dcc0 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
2dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dce0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2dcf0 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
2dd00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2dd10 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2dd20 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2dd30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2dd40 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2dd50 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2dd60 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
2dd70 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2dd80 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
2dd90 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
2dda0 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
2ddb0 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
2ddc0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
2ddd0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
2dde0 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75  >nCell<=0 ) retu
2ddf0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2de00 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
2de10 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2de20 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
2de30 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
2de40 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
2de50 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
2de60 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2de70 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
2de80 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
2de90 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
2dea0 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
2deb0 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
2dec0 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
2ded0 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
2dee0 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
2def0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2df00 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
2df10 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
2df20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2df30 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
2df40 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
2df50 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
2df60 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  age->aOvfl[0].pC
2df70 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  ell;.    u16 szC
2df80 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
2df90 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
2dfa0 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
2dfb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2dfc0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2dfd0 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
2dfe0 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
2dff0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
2e000 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
2e010 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
2e020 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
2e030 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
2e040 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2e050 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
2e060 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2e070 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
2e080 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
2e090 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2e0a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2e0b0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2e0c0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
2e0d0 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
2e0e0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
2e0f0 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
2e100 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
2e110 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
2e120 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
2e130 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
2e140 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
2e150 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
2e160 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
2e170 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
2e180 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
2e190 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
2e1a0 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
2e1b0 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
2e1c0 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
2e1d0 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
2e1e0 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
2e1f0 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
2e200 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
2e210 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
2e220 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2e230 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
2e240 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
2e250 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
2e260 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
2e270 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
2e280 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2e290 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
2e2a0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2e2b0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
2e2c0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
2e2d0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2e2e0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
2e2f0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
2e300 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
2e310 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
2e320 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
2e330 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
2e340 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2e350 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
2e360 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
2e370 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
2e380 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
2e390 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
2e3a0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2e3b0 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
2e3c0 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
2e3d0 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
2e3e0 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
2e3f0 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
2e400 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
2e410 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
2e420 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
2e430 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
2e440 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
2e450 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
2e460 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
2e470 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
2e480 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
2e490 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
2e4a0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
2e4b0 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
2e4c0 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
2e4d0 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
2e4e0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
2e4f0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2e500 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
2e510 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
2e520 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
2e530 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
2e540 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2e550 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
2e560 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
2e570 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
2e580 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
2e590 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
2e5a0 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
2e5b0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
2e5c0 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
2e5d0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2e5e0 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
2e5f0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
2e600 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
2e610 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
2e620 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
2e630 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
2e640 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2e650 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
2e660 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
2e670 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
2e680 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
2e690 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2e6a0 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
2e6b0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
2e6c0 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
2e6d0 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
2e6e0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2e6f0 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
2e700 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
2e710 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
2e720 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
2e730 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
2e740 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
2e750 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
2e760 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
2e770 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2e780 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
2e790 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
2e7a0 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
2e7b0 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
2e7c0 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
2e7d0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
2e7e0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2e7f0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2e800 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2e810 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
2e820 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
2e830 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
2e840 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
2e850 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
2e860 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
2e870 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2e880 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2e890 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
2e8a0 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
2e8b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2e8c0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
2e8d0 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
2e8e0 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
2e8f0 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
2e900 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
2e910 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
2e920 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
2e930 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
2e940 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
2e950 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
2e960 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
2e970 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
2e980 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
2e990 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
2e9a0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
2e9b0 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
2e9c0 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
2e9d0 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
2e9e0 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
2e9f0 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
2ea00 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
2ea10 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2ea20 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
2ea30 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2ea40 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
2ea50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
2ea60 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
2ea70 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
2ea80 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
2ea90 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
2eaa0 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
2eab0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2eac0 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
2ead0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
2eae0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
2eaf0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
2eb00 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
2eb10 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
2eb20 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
2eb30 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
2eb40 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
2eb50 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2eb60 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2eb70 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
2eb80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2eb90 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2eba0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2ebb0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2ebc0 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
2ebd0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
2ebe0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
2ebf0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2ec00 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2ec10 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
2ec20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ec30 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2ec40 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
2ec50 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
2ec60 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2ec70 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2ec80 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
2ec90 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
2eca0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
2ecb0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2ecc0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2ecd0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
2ece0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ecf0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
2ed00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ed10 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
2ed20 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
2ed30 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
2ed40 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
2ed50 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
2ed60 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
2ed70 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
2ed80 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
2ed90 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
2eda0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
2edb0 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
2edc0 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
2edd0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
2ede0 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
2edf0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2ee00 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
2ee10 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
2ee20 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
2ee30 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
2ee40 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
2ee50 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2ee60 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
2ee70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
2ee80 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
2ee90 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2eea0 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
2eeb0 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
2eec0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
2eed0 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
2eee0 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
2eef0 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
2ef00 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29  e.aOvfl[] array)
2ef10 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63  , they are not c
2ef20 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a  opied to pTo. .*
2ef30 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
2ef40 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20  rning, page pTo 
2ef50 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  is reinitialized
2ef60 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74   using btreeInit
2ef70 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
2ef80 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
2ef90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2efa0 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
2efb0 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
2efc0 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
2efd0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
2efe0 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
2eff0 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
2f000 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
2f010 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
2f020 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
2f030 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
2f040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f050 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
2f060 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
2f070 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e  MemPage *pTo, in
2f080 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
2f090 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
2f0a0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
2f0b0 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70   * const pBt = p
2f0c0 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75  From->pBt;.    u
2f0d0 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
2f0e0 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
2f0f0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
2f100 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
2f110 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
2f120 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
2f130 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
2f140 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
2f150 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
2f160 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
2f170 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
2f180 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
2f190 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2f1a0 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
2f1b0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2f1c0 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
2f1d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
2f1e0 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2f1f0 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e  omHdr+5])<=pBt->
2f200 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2f210 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
2f220 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e   b-tree node con
2f230 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70  tent from page p
2f240 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2f250 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d  . */.    iData =
2f260 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
2f270 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
2f280 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
2f290 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44  Data], &aFrom[iD
2f2a0 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ata], pBt->usabl
2f2b0 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20  eSize-iData);.  
2f2c0 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54    memcpy(&aTo[iT
2f2d0 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46  oHdr], &aFrom[iF
2f2e0 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e  romHdr], pFrom->
2f2f0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2f300 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  From->nCell);.  
2f310 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  .    /* Reinitia
2f320 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
2f330 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2f340 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
2f350 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  e structure.    
2f360 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2f370 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2f380 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2f390 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61   can actually fa
2f3a0 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  il under.    ** 
2f3b0 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63  fairly obscure c
2f3c0 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76  ircumstances, ev
2f3d0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
2f3e0 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  a copy of initia
2f3f0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61  lized .    ** pa
2f400 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f  ge pFrom..    */
2f410 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74  .    pTo->isInit
2f420 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
2f430 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f  treeInitPage(pTo
2f440 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2f450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f460 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2f470 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2f480 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2f490 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2f4a0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2f4b0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2f4c0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
2f4d0 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74    ** for any b-t
2f4e0 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ree or overflow 
2f4f0 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e  pages that pTo n
2f500 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
2f510 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20  pointers to..   
2f520 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2f530 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2f540 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c    *pRC = setChil
2f550 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
2f560 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2f570 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2f580 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c  edistributes cel
2f590 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e  ls on the iParen
2f5a0 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66  tIdx'th child of
2f5b0 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72   pParent.** (her
2f5c0 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65  eafter "the page
2f5d0 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73  ") and up to 2 s
2f5e0 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20  iblings so that 
2f5f0 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
2f600 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  bout the.** same
2f610 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
2f620 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61  space. Usually a
2f630 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20   single sibling 
2f640 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2f650 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72  f the.** page ar
2f660 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  e used in the ba
2f670 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20  lancing, though 
2f680 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69  both siblings mi
2f690 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
2f6a0 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65  e.** side if the
2f6b0 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72   page is the fir
2f6c0 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  st or last child
2f6d0 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
2f6e0 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  If the page .** 
2f6f0 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
2f700 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74   siblings (somet
2f710 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
2f720 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2f730 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72  e page.** is a r
2f740 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68  oot page or a ch
2f750 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61  ild of a root pa
2f760 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ge) then all ava
2f770 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a  ilable siblings.
2f780 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69  ** participate i
2f790 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
2f7a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
2f7b0 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
2f7c0 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20   the page might 
2f7d0 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
2f7e0 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a  decreased by .**
2f7f0 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61   one or two in a
2f800 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
2f810 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
2f820 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
2f830 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  full. .**.** Not
2f840 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
2f850 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f860 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
2f870 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
2f880 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
2f890 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
2f8a0 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61  d in MemPage.aDa
2f8b0 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68  ta[]. This can h
2f8c0 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
2f8d0 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
2f8e0 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  . This routine e
2f8f0 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20  nsures that all 
2f900 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a  cells allocated.
2f910 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  ** to the page a
2f920 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20  nd its siblings 
2f930 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65  fit into MemPage
2f940 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20  .aData[] before 
2f950 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2f960 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
2f970 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
2f980 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
2f990 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79  lings, cells may
2f9a0 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20   be.** inserted 
2f9b0 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  into or removed 
2f9c0 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
2f9d0 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20  page (pParent). 
2f9e0 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20  Doing so.** may 
2f9f0 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74  cause the parent
2fa00 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20   page to become 
2fa10 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
2fa20 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a  rfull. If this.*
2fa30 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  * happens, it is
2fa40 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
2fa50 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
2fa60 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  r to invoke the 
2fa70 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e  correct.** balan
2fa80 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20  cing routine to 
2fa90 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  fix this problem
2faa0 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63   (see the balanc
2fab0 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a  e() routine). .*
2fac0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
2fad0 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
2fae0 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
2faf0 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
2fb00 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
2fb10 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
2fb20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
2fb30 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
2fb40 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
2fb50 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
2fb60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64  .**.** The third
2fb70 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2fb80 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66  s function, aOvf
2fb90 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69  lSpace, is a poi
2fba0 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66  nter to a.** buf
2fbb0 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74  fer big enough t
2fbc0 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e  o hold one page.
2fbd0 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74   If while insert
2fbe0 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  ing cells into t
2fbf0 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67  he parent.** pag
2fc00 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20  e (pParent) the 
2fc10 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f  parent page beco
2fc20 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68  mes overfull, th
2fc30 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  is buffer is.** 
2fc40 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
2fc50 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66  e parent's overf
2fc60 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75  low cells. Becau
2fc70 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2fc80 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61   inserts.** a ma
2fc90 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69  ximum of four di
2fca0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
2fcb0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2fcc0 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  , and the maximu
2fcd0 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63  m.** size of a c
2fce0 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69  ell stored withi
2fcf0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  n an internal no
2fd00 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73  de is always les
2fd10 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66  s than 1/4.** of
2fd20 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
2fd30 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d  the aOvflSpace[]
2fd40 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61   buffer is guara
2fd50 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
2fd60 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20  e.** enough for 
2fd70 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  all overflow cel
2fd80 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76  ls..**.** If aOv
2fd90 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74  flSpace is set t
2fda0 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  o a null pointer
2fdb0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2fdc0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
2fdd0 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
2fde0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2fdf0 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61  nonroot(.  MemPa
2fe00 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
2fe10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2fe20 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62  rent page of sib
2fe30 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61  lings being bala
2fe40 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  nced */.  int iP
2fe50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20  arentIdx,       
2fe60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2fe70 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22  ex of "the page"
2fe80 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2fe90 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c   u8 *aOvflSpace,
2fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2feb0 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79   /* page-size by
2fec0 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
2fed0 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a   parent ovfl */.
2fee0 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20    int isRoot    
2fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
2ff10 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70  rent is a root-p
2ff20 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  age */.){.  BtSh
2ff30 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
2ff40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ff50 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
2ff60 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
2ff70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2ff80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
2ff90 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2ffa0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
2ffb0 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
2ffc0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
2ffd0 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
2ffe0 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
2fff0 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
30000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30010 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30020 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
30030 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
30040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30050 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30060 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
30070 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
30080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30090 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
300a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
300b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300c0 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
300d0 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
300e0 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
300f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30100 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
30110 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
30120 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
30130 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
30140 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
30150 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
30160 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
30170 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
30180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30190 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
301a0 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
301b0 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
301c0 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
301d0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
301e0 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
301f0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
30200 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
30210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30220 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
30230 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
30240 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
30250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30260 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
30270 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
30280 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
30290 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
302a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
302b0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
302c0 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
302d0 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
302e0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
302f0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
30300 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
30310 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
30320 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
30330 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
30340 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
30350 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
30360 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
30370 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
30380 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
30390 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
303a0 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
303b0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
303c0 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
303d0 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
303e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
303f0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
30400 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
30410 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
30420 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
30430 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20  /.  u8 *pRight; 
30440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30450 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20   /* Location in 
30460 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d  parent of right-
30470 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20  sibling pointer 
30480 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
30490 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B-1];           
304a0 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
304b0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
304c0 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
304d0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
304e0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
304f0 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
30500 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
30510 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
30520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
30530 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
30540 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
30550 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
30560 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
30570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30580 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
30590 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
305a0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
305b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
305c0 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
305d0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
305e0 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
305f0 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e1;             
30600 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
30610 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
30620 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50  ers cells */.  P
30630 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
30640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30650 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65  emp var to store
30660 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69   a page number i
30670 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  n */..  pBt = pP
30680 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73  arent->pBt;.  as
30690 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
306a0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
306b0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
306c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
306d0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
306e0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
306f0 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22  #if 0.  TRACE(("
30700 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
30710 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
30720 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
30730 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
30740 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  o));.#endif..  /
30750 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
30760 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65  pParent may have
30770 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65   at most one ove
30780 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20  rflow cell. And 
30790 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65  if.  ** this ove
307a0 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72  rflow cell is pr
307b0 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62  esent, it must b
307c0 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
307d0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72  .  ** index iPar
307e0 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65  entIdx. This sce
307f0 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75  nario comes abou
30800 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
30810 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c  tion.  ** is cal
30820 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29  led (indirectly)
30830 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
30840 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f  eeDelete()..  */
30850 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
30860 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
30870 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
30880 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
30890 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
308a0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
308b0 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
308c0 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64  ].idx==iParentId
308d0 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
308e0 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
308f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
30900 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
30910 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
30920 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
30930 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
30940 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
30950 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
30960 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
30970 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
30980 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
30990 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
309a0 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
309b0 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
309c0 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
309d0 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
309e0 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
309f0 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
30a00 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
30a10 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
30a20 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
30a30 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
30a40 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
30a50 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
30a60 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
30a70 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
30a80 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
30a90 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
30aa0 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
30ab0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
30ac0 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
30ad0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
30ae0 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
30af0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
30b00 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
30b10 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
30b20 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
30b30 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20  e, since if any 
30b40 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c  existed they wil
30b50 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65  l.  ** have alre
30b60 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ady been removed
30b70 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  ..  */.  i = pPa
30b80 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
30b90 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
30ba0 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
30bb0 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
30bc0 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
30bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20  }else{.    nOld 
30be0 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61  = 3;.    if( iPa
30bf0 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
30c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
30c10 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
30c20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
30c30 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
30c40 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
30c50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30c60 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
30c70 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
30c80 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20     i = 2;.  }.  
30c90 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
30ca0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
30cb0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
30cc0 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
30cd0 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
30ce0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
30cf0 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
30d00 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
30d10 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
30d20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
30d30 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
30d40 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
30d50 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
30d60 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
30d70 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
30d80 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
30d90 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
30da0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d   rc ){.      mem
30db0 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
30dc0 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
30dd0 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge*));.      got
30de0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
30df0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  p;.    }.    nMa
30e00 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
30e10 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
30e20 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
30e30 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d  .    if( (i--)==
30e40 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
30e50 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61  if( i+nxDiv==pPa
30e60 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  rent->aOvfl[0].i
30e70 64 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  dx && pParent->n
30e80 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
30e90 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
30ea0 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  rent->aOvfl[0].p
30eb0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f  Cell;.      pgno
30ec0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
30ed0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
30ee0 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
30ef0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
30f00 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
30f10 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
30f20 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
30f30 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
30f40 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
30f50 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
30f60 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
30f70 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
30f80 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
30f90 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
30fa0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
30fb0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
30fc0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
30fd0 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
30fe0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
30ff0 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
31000 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
31010 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
31020 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
31030 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
31040 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
31050 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
31060 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
31070 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
31080 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
31090 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
310a0 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
310b0 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
310c0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
310d0 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
310e0 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
310f0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
31100 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
31110 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
31120 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
31130 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
31140 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
31150 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  s SQLite is comp
31160 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64  iled in secure-d
31170 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74  elete mode. In t
31180 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20  his case,.      
31190 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
311a0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
311b0 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
311c0 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
311d0 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
311e0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
311f0 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
31200 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
31210 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
31220 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
31230 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
31240 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
31250 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
31260 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
31270 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
31280 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
31290 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
312a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
312b0 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  Off = SQLITE_PTR
312c0 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d  _TO_INT(apDiv[i]
312d0 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  ) - SQLITE_PTR_T
312e0 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61  O_INT(pParent->a
312f0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  Data);.        i
31300 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69  f( (iOff+szNew[i
31310 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  ])>(int)pBt->usa
31320 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
31330 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31340 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31350 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
31360 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
31370 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
31380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
31390 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
313a0 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
313b0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
313c0 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69  py(&aOvflSpace[i
313d0 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Off], apDiv[i], 
313e0 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
313f0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
31400 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
31410 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
31420 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata];.        }.
31430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72        }.      dr
31440 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
31450 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
31460 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65  >nOverflow, szNe
31470 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  w[i], &rc);.    
31480 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
31490 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
314a0 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72  tiple of 4 in or
314b0 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
314c0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
314d0 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
314e0 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
314f0 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a  s + 3)&~3;..  /*
31500 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
31510 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
31520 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
31530 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53    k = pBt->pageS
31540 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a  ize + ROUND8(siz
31550 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
31560 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
31570 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
31580 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
31590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315a0 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
315b0 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
315c0 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
315d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315e0 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
315f0 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
31600 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31620 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20  /* aSpace1 */.  
31630 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20     + k*nOld;    
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20   /* Page copies 
31670 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70  (apCopy) */.  ap
31680 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
31690 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
316a0 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
316b0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
316c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
316d0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
316e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
316f0 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
31700 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
31710 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65  Cells];.  aSpace
31720 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c  1 = (u8*)&szCell
31730 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
31740 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
31750 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61  E_ALIGNMENT(aSpa
31760 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ce1) );..  /*.  
31770 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
31780 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
31790 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
317a0 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
317b0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
317c0 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
317d0 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
317e0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
317f0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
31800 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
31810 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31  ned from aSpace1
31820 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68  [] and remove th
31830 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65  e the divider Ce
31840 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
31850 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
31860 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
31870 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
31880 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
31890 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
318a0 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
318b0 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
318c0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
318d0 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
318e0 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
318f0 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
31900 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
31910 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
31920 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
31930 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
31940 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
31950 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
31960 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
31970 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
31980 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
31990 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
319a0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
319b0 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
319c0 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
319d0 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
319e0 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
319f0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
31a00 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
31a10 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
31a20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
31a30 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
31a40 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
31a50 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
31a60 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f  s..  */.  leafCo
31a70 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64  rrection = apOld
31a80 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  [0]->leaf*4;.  l
31a90 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b  eafData = apOld[
31aa0 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  0]->hasData;.  f
31ab0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
31ac0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
31ad0 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
31ae0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
31af0 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
31b00 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
31b10 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
31b20 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
31b30 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
31b40 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
31b50 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
31b60 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
31b70 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
31b80 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
31b90 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
31ba0 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
31bb0 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
31bc0 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
31bd0 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
31be0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
31bf0 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
31c00 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
31c10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
31c20 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
31c30 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
31c40 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
31c50 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
31c60 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
31c70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
31c80 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
31c90 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
31ca0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
31cb0 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
31cc0 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
31cd0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28  erflow;.    for(
31ce0 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
31cf0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
31d00 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
31d10 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c  s );.      apCel
31d20 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f  l[nCell] = findO
31d30 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64  verflowCell(pOld
31d40 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  , j);.      szCe
31d50 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
31d60 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
31d70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
31d80 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
31d90 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c   }.    if( i<nOl
31da0 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61  d-1 && !leafData
31db0 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20  ){.      u16 sz 
31dc0 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b  = (u16)szNew[i];
31dd0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
31de0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31df0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
31e00 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
31e10 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
31e20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
31e30 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20  ce1[iSpace1];.  
31e40 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73      iSpace1 += s
31e50 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
31e60 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63   sz<=pBt->maxLoc
31e70 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61  al+23 );.      a
31e80 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d  ssert( iSpace1<=
31e90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
31ea0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
31eb0 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
31ec0 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c  z);.      apCell
31ed0 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
31ee0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
31ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
31f00 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
31f10 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  || leafCorrectio
31f20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a  n==4 );.      sz
31f30 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
31f40 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65  Cell[nCell] - le
31f50 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
31f60 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
31f70 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61  eaf ){.        a
31f80 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
31f90 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
31fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
31fb0 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
31fc0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
31fd0 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
31fe0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
31ff0 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
32000 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  e left.        *
32010 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
32020 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
32030 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
32040 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
32050 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pOld->aData[8], 
32060 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  4);.      }else{
32070 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32080 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
32090 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =4 );.        if
320a0 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c  ( szCell[nCell]<
320b0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
320c0 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
320d0 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
320e0 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
320f0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  /.          szCe
32100 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20  ll[nCell] = 4;. 
32110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32120 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
32130 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
32140 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
32150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
32160 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
32170 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
32180 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
32190 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
321a0 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
321b0 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
321c0 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
321d0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
321e0 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
321f0 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
32200 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
32210 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
32220 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
32230 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
32240 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
32250 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
32260 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
32270 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
32280 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
32290 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
322a0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
322b0 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
322c0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
322d0 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
322e0 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
322f0 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
32300 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
32310 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
32320 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
32330 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
32340 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
32350 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
32360 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
32370 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
32380 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
32390 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
323a0 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
323b0 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
323c0 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
323d0 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
323e0 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
323f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
32400 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
32410 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
32420 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
32430 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
32440 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
32450 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
32460 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
32470 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
32480 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
32490 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
324a0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
324b0 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
324c0 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
324d0 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
324e0 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
324f0 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
32500 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
32510 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b  .      if( k>NB+
32520 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45  1 ){ rc = SQLITE
32530 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 67  _CORRUPT_BKPT; g
32540 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
32550 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d  nup; }.    }.  }
32560 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
32570 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
32580 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
32590 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
325a0 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
325b0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
325c0 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
325d0 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
325e0 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
325f0 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
32600 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
32610 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
32620 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
32630 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
32640 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
32650 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
32660 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
32670 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
32680 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
32690 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
326a0 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
326b0 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
326c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
326d0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
326e0 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
326f0 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
32700 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
32710 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
32720 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
32730 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
32740 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
32750 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
32760 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
32770 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
32780 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
32790 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
327a0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
327b0 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
327c0 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
327d0 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
327e0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
327f0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
32800 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
32810 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
32820 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
32830 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
32840 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
32850 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
32860 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
32870 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
32880 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
32890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
328a0 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
328b0 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
328c0 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
328d0 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
328e0 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
328f0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
32900 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
32910 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
32920 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
32930 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
32940 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
32950 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
32960 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
32970 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
32980 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
32990 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
329a0 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
329b0 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
329c0 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
329d0 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
329e0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
329f0 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
32a00 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
32a10 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
32a20 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
32a30 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
32a40 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
32a50 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
32a60 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
32a70 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
32a80 30 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20  0) or pPage is. 
32a90 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f   ** a virtual ro
32aa0 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74  ot page.  A virt
32ab0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
32ac0 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72   when the real r
32ad0 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73  oot.  ** page is
32ae0 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61   page 1 and we a
32af0 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c  re the only chil
32b00 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a  d of that page..
32b10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63    */.  assert( c
32b20 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70  ntNew[0]>0 || (p
32b30 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20  Parent->pgno==1 
32b40 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
32b50 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43  l==0) );..  TRAC
32b60 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
32b70 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20  : %d %d %d  ",. 
32b80 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e     apOld[0]->pgn
32b90 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  o, .    nOld>=2 
32ba0 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f  ? apOld[1]->pgno
32bb0 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
32bc0 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67  3 ? apOld[2]->pg
32bd0 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20  no : 0.  ));..  
32be0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
32bf0 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
32c00 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
32c10 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
32c20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b   */.  if( apOld[
32c30 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20  0]->pgno<=1 ){. 
32c40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
32c50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
32c60 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
32c70 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67  eanup;.  }.  pag
32c80 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30  eFlags = apOld[0
32c90 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66  ]->aData[0];.  f
32ca0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
32cb0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
32cc0 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c  pNew;.    if( i<
32cd0 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e  nOld ){.      pN
32ce0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20  ew = apNew[i] = 
32cf0 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  apOld[i];.      
32d00 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
32d10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32d20 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
32d30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32d40 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
32d50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
32d60 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
32d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
32d80 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
32d90 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
32da0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
32db0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67  &pNew, &pgno, pg
32dc0 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  no, 0);.      if
32dd0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
32de0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
32df0 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
32e00 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
32e10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
32e20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
32e30 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
32e40 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
32e50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
32e60 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
32e70 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
32e80 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
32e90 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
32ea0 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
32eb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
32ec0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32ed0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
32ee0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
32ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32f00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
32f10 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
32f20 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
32f30 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
32f40 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
32f50 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
32f60 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f      freePage(apO
32f70 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ld[i], &rc);.   
32f80 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
32f90 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
32fa0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
32fb0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
32fc0 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
32fd0 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
32fe0 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
32ff0 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
33000 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
33010 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
33020 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
33030 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
33040 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
33050 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
33060 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
33070 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
33080 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
33090 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
330a0 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
330b0 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
330c0 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
330d0 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
330e0 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
330f0 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
33100 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
33110 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
33120 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
33130 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
33140 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
33150 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
33160 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
33170 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
33180 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
33190 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
331a0 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
331b0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
331c0 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
331d0 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
331e0 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
331f0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
33200 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
33210 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
33220 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
33230 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  o;.    int minI 
33240 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
33250 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
33260 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a       if( apNew[j
33270 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65  ]->pgno<(unsigne
33280 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
33290 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
332a0 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77      minV = apNew
332b0 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [j]->pgno;.     
332c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
332d0 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
332e0 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65   int t;.      Me
332f0 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
33300 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70   t = apNew[i]->p
33310 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d 20  gno;.      pT = 
33320 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  apNew[i];.      
33330 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
33340 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70  [minI];.      ap
33350 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
33360 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
33370 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20  E(("new: %d(%d) 
33380 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
33390 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a  (%d) %d(%d)\n",.
333a0 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67      apNew[0]->pg
333b0 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  no, szNew[0],.  
333c0 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65    nNew>=2 ? apNe
333d0 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[1]->pgno : 0, 
333e0 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b  nNew>=2 ? szNew[
333f0 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  1] : 0,.    nNew
33400 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e  >=3 ? apNew[2]->
33410 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
33420 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30  3 ? szNew[2] : 0
33430 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20  ,.    nNew>=4 ? 
33440 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a  apNew[3]->pgno :
33450 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a   0, nNew>=4 ? sz
33460 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20  New[3] : 0,.    
33470 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b  nNew>=5 ? apNew[
33480 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  4]->pgno : 0, nN
33490 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
334a0 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72   : 0));..  asser
334b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
334c0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
334d0 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
334e0 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68    put4byte(pRigh
334f0 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  t, apNew[nNew-1]
33500 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20  ->pgno);..  /*. 
33510 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
33520 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
33530 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
33540 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
33550 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
33560 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
33570 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
33580 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
33590 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
335a0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
335b0 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
335c0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
335d0 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
335e0 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
335f0 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
33600 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
33610 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
33620 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
33630 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
33640 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
33650 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
33660 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
33670 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
33680 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
33690 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
336a0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
336b0 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
336c0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20  ==0 );..    j = 
336d0 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
336e0 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
336f0 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
33700 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
33710 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
33720 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
33730 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
33740 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
33750 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
33760 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
33770 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c  New-1 || j==nCel
33780 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e  l );.    if( j<n
33790 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38  Cell ){.      u8
337a0 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75   *pCell;.      u
337b0 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
337c0 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61  int sz;..      a
337d0 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
337e0 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  ls );.      pCel
337f0 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20  l = apCell[j];. 
33800 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c       sz = szCell
33810 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63  [j] + leafCorrec
33820 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  tion;.      pTem
33830 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b  p = &aOvflSpace[
33840 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20  iOvflSpace];.   
33850 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65     if( !pNew->le
33860 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  af ){.        me
33870 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74  mcpy(&pNew->aDat
33880 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b  a[8], pCell, 4);
33890 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
338a0 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
338b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
338c0 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61  ree is a leaf-da
338d0 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  ta tree, and the
338e0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65   siblings are le
338f0 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a  aves, .        *
33900 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
33910 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  no divider cell 
33920 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73  in apCell[]. Ins
33930 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65  tead, the divide
33940 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  r .        ** ce
33950 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ll consists of t
33960 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66  he integer key f
33970 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  or the right-mos
33980 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20  t cell of .     
33990 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e     ** the siblin
339a0 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g-page assembled
339b0 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20   above only..   
339c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
339d0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
339e0 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
339f0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
33a00 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
33a10 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
33a20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70         pCell = p
33a30 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a  Temp;.        sz
33a40 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74   = 4 + putVarint
33a50 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f  (&pCell[4], info
33a60 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  .nKey);.        
33a70 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
33a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33a90 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
33aa0 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63      /* Obscure c
33ab0 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66  ase for non-leaf
33ac0 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20  -data trees: If 
33ad0 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c  the cell at pCel
33ae0 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a  l was.        **
33af0 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72   previously stor
33b00 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64  ed on a leaf nod
33b10 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72  e, and its repor
33b20 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20  ted size was 4. 
33b30 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c         ** bytes,
33b40 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74   then it may act
33b50 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72  ually be smaller
33b60 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20   than this .    
33b70 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65      ** (see btre
33b80 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
33b90 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
33ba0 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
33bb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
33bc0 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
33bd0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
33be0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
33bf0 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
33c00 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
33c10 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
33c20 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
33c30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
33c40 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
33c50 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
33c60 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
33c70 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
33c80 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
33c90 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
33ca0 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
33cb0 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
33cc0 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
33cd0 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
33ce0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
33cf0 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
33d00 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
33d10 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
33d20 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
33d30 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
33d40 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
33d50 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
33d60 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
33d70 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
33d80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33d90 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d     iOvflSpace +=
33da0 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
33db0 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c  t( sz<=pBt->maxL
33dc0 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20  ocal+23 );.     
33dd0 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70   assert( iOvflSp
33de0 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
33df0 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65  ze );.      inse
33e00 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
33e10 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
33e20 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70  , pTemp, pNew->p
33e30 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
33e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33e50 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
33e60 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
33e70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e80 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33e90 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
33ea0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
33eb0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
33ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
33ed0 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
33ee0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
33ef0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
33f00 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
33f10 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
33f20 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
33f30 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
33f40 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
33f50 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
33f60 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
33f70 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
33f80 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
33f90 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
33fa0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
33fb0 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
33fc0 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
33fd0 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
33fe0 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
33ff0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
34000 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
34010 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
34020 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
34030 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
34040 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
34050 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
34060 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
34070 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
34080 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
34090 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
340a0 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
340b0 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
340c0 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
340d0 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
340e0 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
340f0 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
34100 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
34110 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
34120 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
34130 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
34140 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
34150 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
34160 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
34170 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
34180 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
34190 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
341a0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
341b0 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
341c0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
341d0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
341e0 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
341f0 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
34200 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
34210 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
34220 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
34230 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
34240 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
34250 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
34260 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
34270 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
34280 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
34290 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
342a0 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
342b0 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
342c0 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
342d0 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
342e0 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
342f0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
34300 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
34310 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
34320 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
34330 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
34340 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
34350 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
34360 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
34370 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
34380 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
34390 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
343a0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
343b0 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65  (apNew[0], pPare
343c0 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72  nt, &rc);.    fr
343d0 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c  eePage(apNew[0],
343e0 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69   &rc);.  }else i
343f0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
34400 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68  ){.    /* Fix th
34410 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
34420 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
34430 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
34440 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
34450 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  . .    ** There 
34460 61 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66  are several diff
34470 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70  erent types of p
34480 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
34490 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  es that need to.
344a0 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
344b0 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75  with by this rou
344c0 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68  tine. Some of th
344d0 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65  ese have been se
344e0 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20  t already, but. 
344f0 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20     ** many have 
34500 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  not. The followi
34510 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a  ng is a summary:
34520 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
34530 20 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20   1) The entries 
34540 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
34550 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
34560 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a  s that were not.
34570 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c      **      sibl
34580 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66  ings when this f
34590 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
345a0 65 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61  ed. These have a
345b0 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20  lready.    **   
345c0 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20     been set. We 
345d0 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f  don't need to wo
345e0 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69  rry about old si
345f0 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
34600 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  .    **      mov
34610 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
34620 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
34630 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
34640 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  ken care.    ** 
34650 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20       of those.. 
34660 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32     **.    **   2
34670 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  ) The pointer-ma
34680 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
34690 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
346a0 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  rst overflow.   
346b0 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e   **      page in
346c0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68   any overflow ch
346d0 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77  ains used by new
346e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20   divider cells. 
346f0 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20  These .    **   
34700 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72     have also alr
34710 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20  eady been taken 
34720 63 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69  care of by the i
34730 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65  nsertCell() code
34740 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
34750 20 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c    3) If the sibl
34760 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
34770 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
34780 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f  he child pages o
34790 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65  f.    **      ce
347a0 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
347b0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
347c0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
347d0 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
347e0 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68     **   4) If th
347f0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
34800 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c  are not internal
34810 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74   intkey nodes, t
34820 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20  hen any.    **  
34830 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
34840 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65  es used by these
34850 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20   cells may need 
34860 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20  to be updated.  
34870 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72    **      (inter
34880 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
34890 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70   never contain p
348a0 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66  ointers to overf
348b0 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20  low pages)..    
348c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49  **.    **   5) I
348d0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
348e0 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
348f0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  es, then the poi
34900 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
34910 20 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72       entries for
34920 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
34930 20 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73   pages of each s
34940 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a  ibling may need.
34950 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62      **      to b
34960 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
34970 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31  *.    ** Cases 1
34980 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74   and 2 are dealt
34990 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f   with above by o
349a0 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e  ther code. The n
349b0 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
349c0 20 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65   deals with case
349d0 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68  s 3 and 4 and th
349e0 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74  e one after that
349f0 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a  , case 5. Since.
34a00 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
34a10 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
34a20 72 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65  ry is a relative
34a30 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  ly expensive ope
34a40 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20  ration, this.   
34a50 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65   ** code only se
34a60 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  ts pointer map e
34a70 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64  ntries for child
34a80 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
34a90 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
34aa0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76   ** actually mov
34ab0 65 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73  ed between pages
34ac0 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
34ad0 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
34ae0 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
34af0 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
34b00 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
34b10 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
34b20 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
34b30 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
34b40 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
34b50 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
34b60 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
34b70 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ow ? pOld->aOvfl
34b80 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20  [0].idx : -1);. 
34b90 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20     j = 0;       
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bb0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
34bc0 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70   'old' sibling p
34bd0 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30  age */.    k = 0
34be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34c00 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73   Current 'new' s
34c10 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
34c20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
34c30 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
34c40 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d   int isDivider =
34c50 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
34c60 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a   i==iNextOld ){.
34c70 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
34c80 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
34c90 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
34ca0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
34cb0 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20  l on old.       
34cc0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
34cd0 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   j. If the sibli
34ce0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
34cf0 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
34d00 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
34d10 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
34d20 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65 72   i was a divider
34d30 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
34d40 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b    pOld = apCopy[
34d50 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e  ++j];.        iN
34d60 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65  extOld = i + !le
34d70 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e  afData + pOld->n
34d80 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76  Cell + pOld->nOv
34d90 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
34da0 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  if( pOld->nOverf
34db0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
34dc0 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c   nOverflow = pOl
34dd0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
34de0 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
34df0 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  w = i + !leafDat
34e00 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  a + pOld->aOvfl[
34e10 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20  0].idx;.        
34e20 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  }.        isDivi
34e30 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b  der = !leafData;
34e40 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
34e50 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
34e60 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f  ow>0 || iOverflo
34e70 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73  w<i );.      ass
34e80 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20  ert(nOverflow<2 
34e90 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30  || pOld->aOvfl[0
34ea0 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
34eb0 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[1].idx-1);.  
34ec0 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
34ed0 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<3 || pOld->
34ee0 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[1].idx==pO
34ef0 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78  ld->aOvfl[2].idx
34f00 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  -1);.      if( i
34f10 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ==iOverflow ){. 
34f20 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
34f30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   = 1;.        if
34f40 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e  ( (--nOverflow)>
34f50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
34f60 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
34f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
34f80 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e       if( i==cntN
34f90 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20  ew[k] ){.       
34fa0 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
34fb0 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
34fc0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
34fd0 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65   last cell on ne
34fe0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  w.        ** sib
34ff0 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20  ling page k. If 
35000 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
35010 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
35020 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
35030 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
35040 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61  then cell i is a
35050 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20   divider cell.  
35060 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
35070 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20  = apNew[++k];.  
35080 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44        if( !leafD
35090 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ata ) continue;.
350a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
350b0 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a  sert( j<nOld );.
350c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
350d0 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f  nNew );..      /
350e0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61  * If the cell wa
350f0 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76  s originally div
35100 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69  ider cell (and i
35110 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20  s not now) or.  
35120 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c      ** an overfl
35130 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74  ow cell, or if t
35140 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61  he cell was loca
35150 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ted on a differe
35160 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20  nt sibling.     
35170 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20   ** page before 
35180 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
35190 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20  hen the pointer 
351a0 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
351b0 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ciated.      ** 
351c0 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f  with any child o
351d0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
351e0 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
351f0 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
35200 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20  f( isDivider || 
35210 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  pOld->pgno!=pNew
35220 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
35230 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
35240 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
35250 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
35260 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
35270 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[i]), PTRMAP_BT
35280 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  REE, pNew->pgno,
35290 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   &rc);.        }
352a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
352b0 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e  ell[i]>pNew->min
352c0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
352d0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
352e0 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
352f0 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  [i], &rc);.     
35300 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35310 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61   }..    if( !lea
35320 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20  fCorrection ){. 
35330 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
35340 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
35350 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65      u32 key = ge
35360 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d  t4byte(&apNew[i]
35370 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
35380 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
35390 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f  Bt, key, PTRMAP_
353a0 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d  BTREE, apNew[i]-
353b0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
353c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20     }.    }..#if 
353d0 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72  0.    /* The ptr
353e0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20  mapCheckPages() 
353f0 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28  contains assert(
35400 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
35410 74 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20  t verify that.  
35420 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72    ** all pointer
35430 20 6d 61 70 20 70 61 67 65 73 20 61 72 65 20 73   map pages are s
35440 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68  et correctly. Th
35450 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68  is is helpful wh
35460 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75  ile .    ** debu
35470 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75  gging. This is u
35480 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20  sually disabled 
35490 62 65 63 61 75 73 65 20 61 20 63 6f 72 72 75 70  because a corrup
354a0 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20  t database may. 
354b0 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61     ** cause an a
354c0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
354d0 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20  t to fail.  */. 
354e0 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
354f0 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29  ges(apNew, nNew)
35500 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  ;.    ptrmapChec
35510 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c  kPages(&pParent,
35520 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   1);.#endif.  }.
35530 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
35540 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
35550 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
35560 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25   finished: old=%
35570 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
35580 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
35590 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
355a0 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  l));..  /*.  ** 
355b0 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
355c0 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
355d0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
355e0 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
355f0 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
35600 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
35610 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
35620 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
35630 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
35640 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
35650 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
35660 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20  pNew[i]);.  }.. 
35670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
35680 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
35690 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
356a0 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  en the root page
356b0 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72   of a b-tree str
356c0 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65  ucture is.** ove
356d0 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f  rfull (has one o
356e0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
356f0 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20  pages)..**.** A 
35700 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69  new child page i
35710 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
35720 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
35730 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74  the current root
35740 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64  .** page, includ
35750 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ing overflow cel
35760 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69  ls, are copied i
35770 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54  nto the child. T
35780 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
35790 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  is then overwrit
357a0 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61  ten to make it a
357b0 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74  n empty page wit
357c0 68 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  h the right-chil
357d0 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f  d .** pointer po
357e0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
357f0 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  w page..**.** Be
35800 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
35810 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
35820 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
35830 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a  nding to pages .
35840 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
35850 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63  child-page now c
35860 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
35870 20 74 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e   to are updated.
35880 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f   The.** entry co
35890 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
358a0 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
358b0 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ld pointer of th
358c0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
358d0 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a  s also updated..
358e0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
358f0 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73  ful, *ppChild is
35900 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20   set to contain 
35910 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
35920 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67  he child .** pag
35930 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
35940 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
35950 74 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61  this case the ca
35960 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64  ller is required
35970 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  .** to call rele
35980 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70  asePage() on *pp
35990 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e  Child exactly on
359a0 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ce. If an error 
359b0 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
359c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
359d0 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c  rned and *ppChil
359e0 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
359f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
35a00 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
35a10 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50  age *pRoot, MemP
35a20 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a  age **ppChild){.
35a30 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
35a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a50 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
35a60 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
35a70 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
35a80 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20   *pChild = 0;   
35a90 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
35aa0 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
35ab0 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
35ac0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20   pgnoChild = 0; 
35ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
35ae0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
35af0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
35b00 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
35b10 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b  Bt = pRoot->pBt;
35b20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
35b30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
35b40 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Root->nOverflow>
35b50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
35b60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35b70 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
35b80 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f  ..  /* Make pRoo
35b90 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  t, the root page
35ba0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20   of the b-tree, 
35bb0 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61  writable. Alloca
35bc0 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70  te a new .  ** p
35bd0 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
35be0 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67  come the new rig
35bf0 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67  ht-child of pPag
35c00 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  e. Copy the cont
35c10 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
35c20 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20   node stored on 
35c30 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e  pRoot into the n
35c40 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ew child page.. 
35c50 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
35c60 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
35c70 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
35c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35c90 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  K ){.    rc = al
35ca0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
35cb0 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e  pBt,&pChild,&pgn
35cc0 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67  oChild,pRoot->pg
35cd0 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e  no,0);.    copyN
35ce0 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74  odeContent(pRoot
35cf0 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a  , pChild, &rc);.
35d00 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
35d10 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
35d20 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
35d30 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42  oChild, PTRMAP_B
35d40 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  TREE, pRoot->pgn
35d50 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
35d60 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
35d70 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b     *ppChild = 0;
35d80 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
35d90 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65  (pChild);.    re
35da0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
35db0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
35dc0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35dd0 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20  Child->pDbPage) 
35de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
35df0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
35e00 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
35e10 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
35e20 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
35e30 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b  =pRoot->nCell );
35e40 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
35e50 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
35e60 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52  d into %d\n", pR
35e70 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  oot->pgno, pChil
35e80 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a  d->pgno));..  /*
35e90 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c   Copy the overfl
35ea0 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52  ow cells from pR
35eb0 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f  oot to pChild */
35ec0 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64  .  memcpy(pChild
35ed0 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e  ->aOvfl, pRoot->
35ee0 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f  aOvfl, pRoot->nO
35ef0 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
35f00 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Root->aOvfl[0]))
35f10 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  ;.  pChild->nOve
35f20 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e  rflow = pRoot->n
35f30 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20  Overflow;..  /* 
35f40 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  Zero the content
35f50 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e  s of pRoot. Then
35f60 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20   install pChild 
35f70 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  as the right-chi
35f80 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67  ld. */.  zeroPag
35f90 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d  e(pRoot, pChild-
35fa0 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
35fb0 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
35fc0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
35fd0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
35fe0 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
35ff0 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20  ;..  *ppChild = 
36000 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e  pChild;.  return
36010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
36020 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68  *.** The page th
36030 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c  at pCur currentl
36040 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  y points to has 
36050 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69  just been modifi
36060 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61  ed in.** some wa
36070 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
36080 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20   figures out if 
36090 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f  this modificatio
360a0 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74  n means the.** t
360b0 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ree needs to be 
360c0 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66  balanced, and if
360d0 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70   so calls the ap
360e0 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
360f0 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  ing .** routine.
36100 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   Balancing routi
36110 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  nes are:.**.**  
36120 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
36130 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65  .**   balance_de
36140 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61  eper().**   bala
36150 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f  nce_nonroot().*/
36160 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
36170 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
36180 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
36190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e  SQLITE_OK;.  con
361a0 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43  st int nMin = pC
361b0 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ur->pBt->usableS
361c0 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75  ize * 2 / 3;.  u
361d0 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  8 aBalanceQuickS
361e0 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a  pace[13];.  u8 *
361f0 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45  pFree = 0;..  TE
36200 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61  STONLY( int bala
36210 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
36220 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e   = 0 );.  TESTON
36230 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
36240 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20  deeper_called = 
36250 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  0 );..  do {.   
36260 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
36270 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65  r->iPage;.    Me
36280 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
36290 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
362a0 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61  e];..    if( iPa
362b0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ge==0 ){.      i
362c0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
362d0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  low ){.        /
362e0 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
362f0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  of the b-tree is
36300 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68   overfull. In th
36310 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65  is case call the
36320 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
36330 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e  nce_deeper() fun
36340 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ction to create 
36350 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20  a new child for 
36360 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
36370 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70        ** and cop
36380 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  y the current co
36390 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
363a0 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54  ot-page to it. T
363b0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  he.        ** ne
363c0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
363d0 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
363e0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69   balance the chi
363f0 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ld page..       
36400 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73   */ .        ass
36410 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65  ert( (balance_de
36420 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  eper_called++)==
36430 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
36440 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
36450 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61  (pPage, &pCur->a
36460 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20  pPage[1]);.     
36470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36490 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
364a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  1;.          pCu
364b0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
364c0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
364d0 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20  >aiIdx[1] = 0;. 
364e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
364f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
36500 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
36510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36520 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72  else{.        br
36530 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
36540 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
36550 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
36560 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d  & pPage->nFree<=
36570 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72  nMin ){.      br
36580 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
36590 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20        MemPage * 
365a0 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20  const pParent = 
365b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
365c0 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74  ge-1];.      int
365d0 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43   const iIdx = pC
365e0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d  ur->aiIdx[iPage-
365f0 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  1];..      rc = 
36600 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36610 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
36620 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
36630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36640 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36650 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
36660 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
36670 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20  ge->hasData.    
36680 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e       && pPage->n
36690 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20  Overflow==1.    
366a0 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61       && pPage->a
366b0 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
366c0 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  ge->nCell.      
366d0 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70     && pParent->p
366e0 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20  gno!=1.         
366f0 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
36700 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20  l==iIdx.        
36710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
36720 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  Call balance_qui
36730 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61  ck() to create a
36740 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20   new sibling of 
36750 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20  pPage on which. 
36760 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73           ** to s
36770 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  tore the overflo
36780 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f  w cell. balance_
36790 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20  quick() inserts 
367a0 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20  a new cell.     
367b0 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61       ** into pPa
367c0 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
367d0 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76  cause pParent ov
367e0 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a  erflow. If this.
367f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
36800 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69  pens, the next i
36810 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  nteration of the
36820 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
36830 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20  lance pParent . 
36840 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
36850 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e  either balance_n
36860 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61  onroot() or bala
36870 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e  nce_deeper(). Un
36880 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20  til this.       
36890 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
368a0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
368b0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
368c0 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
368d0 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20  pace[].         
368e0 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20   ** buffer. .   
368f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
36900 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f      ** The purpo
36910 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
36920 69 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20  ing assert() is 
36930 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e  to check that on
36940 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  ly a.          *
36950 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f  * single call to
36960 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
36970 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63   is made for eac
36980 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  h call to this. 
36990 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
369a0 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65  tion. If this we
369b0 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c  re not verified,
369c0 20 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e   a subtle bug in
369d0 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20  volving reuse.  
369e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
369f0 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
36a00 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65  pace[] might sne
36a10 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20  ak in..         
36a20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
36a30 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71  sert( (balance_q
36a40 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  uick_called++)==
36a50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
36a60 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  c = balance_quic
36a70 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65  k(pParent, pPage
36a80 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  , aBalanceQuickS
36a90 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  pace);.        }
36aa0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
36ab0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
36ac0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
36ad0 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f   call balance_no
36ae0 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73  nroot() to redis
36af0 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20  tribute cells.  
36b00 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
36b10 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  en pPage and up 
36b20 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c  to 2 of its sibl
36b30 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
36b40 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20  involves.       
36b50 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20     ** modifying 
36b60 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36b70 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d  pParent, which m
36b80 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74  ay cause pParent
36b90 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
36ba0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
36bb0 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54   or underfull. T
36bc0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
36bd0 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
36be0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69  .          ** wi
36bf0 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  ll balance the p
36c00 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f  arent page to co
36c10 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20  rrect this..    
36c20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
36c30 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61      ** If the pa
36c40 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
36c50 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20  s overfull, the 
36c60 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72  overflow cell or
36c70 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20   cells.         
36c80 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69   ** are stored i
36c90 6e 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  n the pSpace buf
36ca0 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d  fer allocated im
36cb0 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e  mediately below.
36cc0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41   .          ** A
36cd0 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
36ce0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
36cf0 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  loop will deal w
36d00 69 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20  ith this by.    
36d10 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
36d20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
36d30 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  () (balance_deep
36d40 65 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c  er() may be call
36d50 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20  ed first,.      
36d60 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f      ** but it do
36d70 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20  esn't deal with 
36d80 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d  overflow cells -
36d90 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d   just moves them
36da0 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20   to a.          
36db0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  ** different pag
36dc0 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75  e). Once this su
36dd0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
36de0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
36df0 28 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  () .          **
36e00 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20   has completed, 
36e10 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
36e20 6c 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65  lease the pSpace
36e30 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a   buffer used by.
36e40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
36e50 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20   previous call, 
36e60 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  as the overflow 
36e70 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68  cell data will h
36e80 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20  ave been .      
36e90 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69      ** copied ei
36ea0 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f  ther into the bo
36eb0 64 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  dy of a database
36ec0 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68   page or into th
36ed0 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20  e new.          
36ee0 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72  ** pSpace buffer
36ef0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c   passed to the l
36f00 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61  atter call to ba
36f10 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
36f20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
36f30 20 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61          u8 *pSpa
36f40 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
36f50 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74  Malloc(pCur->pBt
36f60 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
36f70 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
36f80 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72  nce_nonroot(pPar
36f90 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63  ent, iIdx, pSpac
36fa0 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20  e, iPage==1);.  
36fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
36fc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
36fd0 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20   /* If pFree is 
36fe0 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
36ff0 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63  nts to the pSpac
37000 65 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20  e buffer used . 
37010 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79             ** by
37020 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c   a previous call
37030 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
37040 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65  oot(). Its conte
37050 6e 74 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  nts are.        
37060 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65      ** now store
37070 64 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c  d either on real
37080 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
37090 6f 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20  or within the . 
370a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65             ** ne
370b0 77 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c  w pSpace buffer,
370c0 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61   so it may be sa
370d0 66 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e  fely freed here.
370e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
370f0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
37100 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  pFree);.        
37110 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
37120 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
37130 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65  fer will be free
37140 64 20 61 66 74 65 72 20 74 68 65 20 6e 65 78 74  d after the next
37150 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20   call to.       
37160 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f     ** balance_no
37170 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74  nroot(), or just
37180 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
37190 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77  ction returns, w
371a0 68 69 63 68 65 76 65 72 0a 20 20 20 20 20 20 20  hichever.       
371b0 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73     ** comes firs
371c0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
371d0 70 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a  pFree = pSpace;.
371e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
371f0 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  }..      pPage->
37200 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
37210 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
37220 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
37230 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e  he do-loop balan
37240 63 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70  ces the parent p
37250 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  age. */.      re
37260 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
37270 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50  ;.      pCur->iP
37280 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
37290 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
372a0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  E_OK );..  if( p
372b0 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
372c0 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
372d0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
372e0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
372f0 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
37300 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
37310 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
37320 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
37330 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
37340 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
37350 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
37360 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
37370 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
37380 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
37390 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
373a0 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
373b0 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
373c0 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
373d0 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
373e0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
373f0 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
37400 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
37410 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
37420 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
37430 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
37440 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
37450 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
37460 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
37470 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
37480 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
37490 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
374a0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
374b0 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  en a successful 
374c0 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74  call to.** Movet
374d0 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73  oUnpacked() to s
374e0 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20  eek cursor pCur 
374f0 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20  to (pKey, nKey) 
37500 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
37510 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73  een performed. s
37520 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65  eekResult is the
37530 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72   search result r
37540 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74  eturned (a negat
37550 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66  ive.** number if
37560 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
37570 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73  an entry that is
37580 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70   smaller than (p
37590 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a  Key, nKey), or.*
375a0 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  * a positive val
375b0 75 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  ue if pCur point
375c0 73 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61  s at an etry tha
375d0 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
375e0 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79   .** (pKey, nKey
375f0 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  )). .**.** If th
37600 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72  e seekResult par
37610 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
37620 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ro, then the cal
37630 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
37640 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43  hat.** cursor pC
37650 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 61  ur is pointing a
37660 74 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  t the existing c
37670 6f 70 79 20 6f 66 20 61 20 72 6f 77 20 74 68 61  opy of a row tha
37680 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20 6f 76  t is to be.** ov
37690 65 72 77 72 69 74 74 65 6e 2e 20 20 49 66 20 74  erwritten.  If t
376a0 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
376b0 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
376c0 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d  en cursor pCur m
376d0 61 79 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ay.** point to a
376e0 6e 79 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e  ny entry or to n
376f0 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 20 61  o entry at all a
37700 6e 64 20 73 6f 20 74 68 69 73 20 66 75 6e 63 74  nd so this funct
37710 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a  ion has to seek.
37720 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  ** the cursor be
37730 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79  fore the new key
37740 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64   can be inserted
37750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37760 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42  BtreeInsert(.  B
37770 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37790 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
377a0 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74  o the table of t
377b0 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
377c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
377d0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
377e0 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65  * The key of the
377f0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
37800 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
37810 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  ta, int nData,  
37820 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74  /* The data of t
37830 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
37840 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
37850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37860 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
37870 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20  xtra 0 bytes to 
37880 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a  append to data *
37890 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69  /.  int appendBi
378a0 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  as,             
378b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
378c0 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20  is is likely an 
378d0 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  append */.  int 
378e0 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20  seekResult      
378f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37900 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f  sult of prior Mo
37910 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 63  vetoUnpacked() c
37920 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  all */.){.  int 
37930 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20  rc;.  int loc = 
37940 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 20 20  seekResult;     
37950 20 20 20 20 20 2f 2a 20 2d 31 3a 20 62 65 66 6f       /* -1: befo
37960 72 65 20 64 65 73 69 72 65 64 20 6c 6f 63 61 74  re desired locat
37970 69 6f 6e 20 20 2b 31 3a 20 61 66 74 65 72 20 2a  ion  +1: after *
37980 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 20 3d 20  /.  int szNew = 
37990 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  0;.  int idx;.  
379a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
379b0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
379c0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
379d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
379e0 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
379f0 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20  char *oldCell;. 
37a00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
37a10 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20  newCell = 0;..  
37a20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
37a30 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
37a40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
37a50 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
37a60 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
37a70 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
37a80 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Next;.  }..  ass
37a90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
37aa0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
37ab0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77   assert( pCur->w
37ac0 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rFlag && pBt->in
37ad0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
37ae0 4e 53 5f 57 52 49 54 45 20 26 26 20 21 70 42 74  NS_WRITE && !pBt
37af0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
37b00 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
37b10 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
37b20 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
37b30 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  t, pCur->pKeyInf
37b40 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f  o!=0, 2) );..  /
37b50 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
37b60 65 20 63 61 6c 6c 65 72 20 68 61 73 20 62 65 65  e caller has bee
37b70 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20 49 66  n consistent. If
37b80 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73   this cursor was
37b90 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 65 78 70   opened.  ** exp
37ba0 65 63 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  ecting an index 
37bb0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65  b-tree, then the
37bc0 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62   caller should b
37bd0 65 20 69 6e 73 65 72 74 69 6e 67 20 62 6c 6f 62  e inserting blob
37be0 0a 20 20 2a 2a 20 6b 65 79 73 20 77 69 74 68 20  .  ** keys with 
37bf0 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  no associated da
37c00 74 61 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f  ta. If the curso
37c10 72 20 77 61 73 20 6f 70 65 6e 65 64 20 65 78 70  r was opened exp
37c20 65 63 74 69 6e 67 20 61 6e 0a 20 20 2a 2a 20 69  ecting an.  ** i
37c30 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
37c40 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62   caller should b
37c50 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 65  e inserting inte
37c60 67 65 72 20 6b 65 79 73 20 77 69 74 68 20 61 0a  ger keys with a.
37c70 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 73 73    ** blob of ass
37c80 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 20 2a  ociated data.  *
37c90 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 4b 65  /.  assert( (pKe
37ca0 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
37cb0 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
37cc0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
37cd0 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20  n insert into a 
37ce0 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e  table b-tree, in
37cf0 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
37d00 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73  rblob .  ** curs
37d10 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
37d20 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61 63  row being replac
37d30 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68 69  ed (assuming thi
37d40 73 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a 20  s is a replace. 
37d50 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20   ** operation - 
37d60 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  if it is not, th
37d70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
37d80 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69   no-op).  */.  i
37d90 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf
37da0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61  o==0 ){.    inva
37db0 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
37dc0 72 73 6f 72 73 28 70 2c 20 6e 4b 65 79 2c 20 30  rsors(p, nKey, 0
37dd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  );.  }..  /* Sav
37de0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
37df0 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
37e00 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
37e10 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  s table..  **.  
37e20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  ** In some cases
37e30 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 74  , the call to bt
37e40 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f  reeMoveto() belo
37e50 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f  w is a no-op. Fo
37e60 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  r.  ** example, 
37e70 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
37e80 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
37e90 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72   with auto-gener
37ea0 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a  ated integer.  *
37eb0 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45  * keys, the VDBE
37ec0 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73   layer invokes s
37ed0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
37ee0 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
37ef0 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65  the .  ** intege
37f00 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74  r key to use. It
37f10 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73   then calls this
37f20 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74   function to act
37f30 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65  ually insert the
37f40 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f   .  ** data into
37f50 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72   the intkey B-Tr
37f60 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
37f70 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 72   btreeMoveto() r
37f80 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74  ecognizes.  ** t
37f90 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
37fa0 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65 20  s already where 
37fb0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
37fc0 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  nd returns witho
37fd0 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e  ut.  ** doing an
37fe0 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64  y work. To avoid
37ff0 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73 65   thwarting these
38000 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20   optimizations, 
38010 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a  it is important.
38020 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61    ** not to clea
38030 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65 72  r the cursor her
38040 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
38050 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
38060 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
38070 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66 28 20  t, pCur);.  if( 
38080 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
38090 20 20 69 66 28 20 21 6c 6f 63 20 29 7b 0a 20 20    if( !loc ){.  
380a0 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
380b0 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
380c0 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c  Key, appendBias,
380d0 20 26 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20   &loc);.    if( 
380e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
380f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
38100 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
38110 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 43 75  OR_VALID || (pCu
38120 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
38130 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c 6f 63  R_INVALID && loc
38140 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  ) );..  pPage = 
38150 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
38160 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
38170 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
38180 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
38190 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
381a0 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
381b0 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 54  ->intKey );..  T
381c0 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
381d0 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
381e0 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
381f0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
38200 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
38210 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
38220 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
38230 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
38240 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
38250 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
38260 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
38270 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
38280 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
38290 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
382a0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
382b0 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
382c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
382d0 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
382e0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
382f0 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
38300 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
38310 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
38320 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
38330 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
38340 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
38350 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
38360 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
38370 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
38380 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
38390 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75  ) );.  idx = pCu
383a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
383b0 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63  Page];.  if( loc
383c0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ==0 ){.    u16 s
383d0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
383e0 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  (