/ Hex Artifact Content
Login

Artifact b53e009bccb4cfcbcde074f586f0c1c6712a0e12:


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 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5690: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
56a0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
56b0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
56c0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
56d0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
56e0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
56f0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
5700: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
5710: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
5720: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
5730: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
5740: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5750: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5760: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5770: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
5780: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
5790: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
57a0: 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  dxKey);.  }else{
57b0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
57c0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
57d0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57e0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57f0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
5800: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
5810: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
5820: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
5830: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
5840: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
5850: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5860: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
5870: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
5880: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
5890: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
58a0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
58b0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
58c0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
58d0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
58e0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
58f0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
5900: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
5910: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
5920: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
5930: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
5940: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
5950: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
5960: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
5970: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
5980: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5990: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
59a0: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
59b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
59d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
59e0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
59f0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5a00: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5a10: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
5a20: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
5a30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
5a40: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
5a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
5a60: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
5a70: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5a80: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5a90: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
5aa0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
5ab0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
5ac0: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
5ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
5ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
5b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
5b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
5b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
5b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
5b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
5b70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
5b80: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
5b90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
5ba0: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
5bb0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5bc0: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
5bd0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
5be0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
5bf0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
5c00: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
5c10: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
5c20: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
5c30: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
5c40: 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20   position it.** 
5c50: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20  was last placed 
5c60: 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e  at.  Cursors can
5c70: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
5c80: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
5c90: 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65  ting.** at is de
5ca0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
5cb0: 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  nder them..**.**
5cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5cd0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63  turns an error c
5ce0: 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ode if something
5cf0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68   goes wrong.  Th
5d00: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48  e.** integer *pH
5d10: 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  asMoved is set t
5d20: 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72  o one if the cur
5d30: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e  sor has moved an
5d40: 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  d 0 if not..*/.i
5d50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
5d60: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
5d70: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
5d80: 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20  t *pHasMoved){. 
5d90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
5da0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5db0: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
5dc0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
5dd0: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5df0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
5e00: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
5e10: 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e  D || pCur->skipN
5e20: 65 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ext!=0 ){.    *p
5e30: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73  }else{.    *pHas
5e50: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Moved = 0;.  }. 
5e60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5e70: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
5e80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5e90: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
5ea0: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
5eb0: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
5ec0: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
5ed0: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
5ee0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
5ef0: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
5f00: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
5f10: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
5f20: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
5f30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
5f40: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
5f50: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
5f60: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
5f70: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
5f80: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
5f90: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
5fa0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
5fb0: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
5fc0: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
5fd0: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
5fe0: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
5ff0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
6000: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
6010: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
6020: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
6030: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
6040: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6050: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6060: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
6070: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
6080: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
6090: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
60a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
60b0: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
60c0: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
60d0: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
60e0: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
60f0: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
6100: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
6110: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
6120: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
6130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6140: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
6150: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
6160: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6180: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
6190: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
61a0: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
61b0: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
61c0: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
61d0: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
61e0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
61f0: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
6200: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
6210: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
6220: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
6230: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6240: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
6250: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6260: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
6270: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
6280: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
6290: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
62a0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
62b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
62c0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
62d0: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
62e0: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
62f0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6300: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
6310: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
6320: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
6330: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6340: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
6350: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
6360: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6370: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
6380: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6390: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
63a0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
63b0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
63c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
63d0: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
63e0: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
63f0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
6400: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
6410: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6420: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6430: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
6440: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
6450: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
6460: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
6470: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
6480: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
6490: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
64a0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
64b0: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
64c0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
64d0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
64e0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
64f0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6500: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
6510: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
6520: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6530: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6550: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6560: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6570: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6580: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6590: 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
65a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
65b0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
65c0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
65d0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
65e0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70  fset<0 ){.    *p
65f0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6600: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
6610: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
6620: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6630: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
6640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
6650: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
6660: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6670: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
6680: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
6690: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
66a0: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
66b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
66c0: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
66d0: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
66e0: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
66f0: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
6700: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
6710: 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74  *pRC= rc = sqlit
6720: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
6730: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
6740: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6750: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
6760: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
6770: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
6780: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6790: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
67a0: 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69  .  }..ptrmap_exi
67b0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t:.  sqlite3Page
67c0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
67d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
67e0: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
67f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
6800: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6810: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
6820: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6830: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
6840: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6850: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
6860: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
6870: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
6880: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
6890: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
68a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
68b0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
68c0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
68d0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
68e0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
68f0: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
6900: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
6910: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
6920: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
6930: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
6940: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6950: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
6960: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6970: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
6980: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
6990: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
69a0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
69b0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
69c0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
69d0: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
69e0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
69f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
6a00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6a10: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
6a20: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
6a30: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
6a40: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
6a50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
6a60: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
6a70: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
6a80: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
6a90: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6aa0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
6ab0: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6ac0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6ad0: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
6ae0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
6af0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
6b00: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
6b10: 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et<0 ){.    sqli
6b20: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6b30: 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  bPage);.    retu
6b40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6b50: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
6b60: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6b70: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6b80: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65  Size-5 );.  asse
6b90: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
6ba0: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
6bb0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
6bc0: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
6bd0: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
6be0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6bf0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
6c00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6c10: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
6c20: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
6c30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6c40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
6c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c60: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
6c70: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
6c80: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
6c90: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
6ca0: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
6cb0: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
6cc0: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
6cd0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
6ce0: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
6cf0: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
6d00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
6d10: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
6d20: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
6d30: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
6d40: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
6d50: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
6d60: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
6d70: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
6d80: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
6d90: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
6da0: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
6db0: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
6dc0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
6dd0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
6de0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
6df0: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
6e00: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
6e10: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
6e20: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
6e30: 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61  get2byte(&(P)->a
6e40: 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66  Data[(P)->cellOf
6e50: 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 23  fset+2*(I)]))).#
6e60: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 76  define findCellv
6e70: 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d  2(D,M,O,I) (D+(M
6e80: 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b 32  &get2byte(D+(O+2
6e90: 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I))))).../*.**
6ea0: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
6eb0: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
6ec0: 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  findCell() that 
6ed0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
6ee0: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
6ef0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6f00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
6f10: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
6f20: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
6f30: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
6f40: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
6f50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6f60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6f70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
6f80: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
6f90: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
6fa0: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
6fb0: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
6fc0: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
6fd0: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
6fe0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
6ff0: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
7000: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
7010: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
7020: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
7030: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
7040: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
7050: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7070: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7080: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7090: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
70a0: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
70b0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
70c0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
70d0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
70e0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
70f0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7100: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7110: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7120: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7130: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7140: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7150: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7160: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7170: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7180: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7190: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
71a0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
71b0: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
71c0: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
71d0: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
71e0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
71f0: 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20  r(). Using some 
7200: 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20  compilers, this 
7210: 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a  will be faster..
7220: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
7230: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7240: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
7250: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
7260: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
7270: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
7280: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
7290: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
72a0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
72b0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
72c0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
72d0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
72e0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
72f0: 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20   u16 n;         
7300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7310: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
7320: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
7330: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
7340: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7350: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7360: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
7370: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
7380: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7390: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
73a0: 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ex) );..  pInfo-
73b0: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
73c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
73d0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
73e0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
73f0: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
7400: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
7410: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
7420: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
7430: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
7440: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7450: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7460: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7470: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7480: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  load);.    }else
7490: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
74a0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
74b0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
74c0: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29  pCell[n], (u64*)
74d0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
74e0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
74f0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  = nPayload;.  }e
7500: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
7510: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e  nData = 0;.    n
7520: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7530: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
7540: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
7550: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
7560: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
7570: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
7580: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
7590: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74  ader = n;.  test
75a0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
75b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
75c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
75d0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
75e0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
75f0: 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c  if( likely(nPayl
7600: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
7610: 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
7620: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
7630: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
7640: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
7650: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
7660: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
7670: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
7680: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
7690: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
76a0: 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20  (pInfo->nSize = 
76b0: 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61 64  (u16)(n+nPayload
76c0: 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ))<4 ) pInfo->nS
76d0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
76e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
76f0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
7700: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7710: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7720: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
7730: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
7740: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
7750: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
7760: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
7770: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
7780: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
7790: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
77a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
77b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
77c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
77d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
77e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
77f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
7800: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
7810: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
7820: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
7830: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
7840: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
7850: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
7860: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
7870: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
7880: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
7890: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
78a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
78b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
78c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
78d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
78e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
78f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
7900: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
7910: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
7920: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
7930: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
7940: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
7950: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
7960: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
7970: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
7980: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
7990: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
79a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
79b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
79c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
79d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
79e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
79f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
7a00: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
7a10: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
7a20: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
7a30: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
7a40: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
7a50: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
7a60: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
7a70: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
7a80: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
7a90: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
7aa0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
7ab0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7ac0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
7ad0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
7ae0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
7af0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
7b00: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
7b10: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7b20: 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e   = (u16)(pInfo->
7b30: 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20  nLocal + n);.   
7b40: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
7b50: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7b60: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66   + 4;.  }.}.#def
7b70: 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ine parseCell(pP
7b80: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
7b90: 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73  o) \.  btreePars
7ba0: 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29  eCellPtr((pPage)
7bb0: 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67  , findCell((pPag
7bc0: 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70  e), (iCell)), (p
7bd0: 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f  Info)).static vo
7be0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
7bf0: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
7c00: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7c10: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7c20: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
7c30: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
7c40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
7c50: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
7c60: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
7c70: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
7c80: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
7c90: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
7ca0: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
7cb0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7cc0: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
7cd0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
7ce0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
7cf0: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
7d00: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
7d10: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
7d20: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
7d30: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
7d40: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
7d50: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
7d60: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
7d70: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
7d80: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
7d90: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
7da0: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
7db0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
7dc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
7dd0: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
7de0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
7df0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
7e00: 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67  er = &pCell[pPag
7e10: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
7e20: 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a  ;.  u32 nSize;..
7e30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7e40: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
7e50: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
7e60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
7e70: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
7e80: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
7e90: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
7ea0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
7eb0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
7ec0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
7ed0: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
7ee0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
7ef0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
7f00: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
7f10: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
7f20: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
7f30: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
7f40: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
7f50: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
7f60: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72  debuginfo;.  btr
7f70: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
7f80: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
7f90: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
7fa0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ..  if( pPage->i
7fb0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20  ntKey ){.    u8 
7fc0: 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  *pEnd;.    if( p
7fd0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
7fe0: 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  .      pIter += 
7ff0: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
8000: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d  r, nSize);.    }
8010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a  else{.      nSiz
8020: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
8030: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
8040: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
8050: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
8060: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
8070: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
8080: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
8090: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
80a0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
80b0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
80c0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
80d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
80e0: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
80f0: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8100: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8110: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8120: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
8140: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
8150: 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b  2(pIter, nSize);
8160: 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65  .  }..  testcase
8170: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8180: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
8190: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
81a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
81b0: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e   );.  if( nSize>
81c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
81d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  ){.    int minLo
81e0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
81f0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
8200: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
8210: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
8220: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
8230: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
8240: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
8250: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
8260: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
8270: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8280: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8290: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
82a0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
82b0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
82c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
82d0: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
82e0: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d  ;.  }.  nSize +=
82f0: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
8300: 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Cell);..  /* The
8310: 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
8320: 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62   any cell is 4 b
8330: 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  ytes. */.  if( n
8340: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53  Size<4 ){.    nS
8350: 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  ize = 4;.  }..  
8360: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
8370: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29  ebuginfo.nSize )
8380: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
8390: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66  nSize;.}..#ifdef
83a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
83b0: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
83c0: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
83d0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
83e0: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
83f0: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
8400: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
8410: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
8420: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
8430: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c  ){.  return cell
8440: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66  SizePtr(pPage, f
8450: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
8460: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
8470: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8480: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8490: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
84a0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
84b0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
84c0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
84d0: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
84e0: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
84f0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
8500: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
8510: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
8520: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
8530: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
8540: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
8550: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8560: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
8570: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
8580: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8590: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
85a0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65  ll!=0 );.  btree
85b0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
85c0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
85d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
85e0: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
85f0: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
8600: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
8610: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e  load );.  if( in
8620: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
8630: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
8640: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
8650: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
8660: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
8670: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
8680: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
8690: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
86a0: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
86b0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
86c0: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
86d0: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
86e0: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
86f0: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
8700: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
8710: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
8720: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
8730: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
8740: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
8750: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
8760: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
8770: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
8780: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8790: 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rea..*/.static i
87a0: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
87b0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
87c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
87f0: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8810: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
8820: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
8830: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
8840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8850: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
8860: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
8870: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
8880: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8890: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
88a0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
88b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
88c0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
88d0: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
88e0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
88f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8900: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
8910: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
8920: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8950: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8960: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
8970: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
89a0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
89b0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
89c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
89d0: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
89e0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
89f0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
8a00: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
8a10: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
8a20: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
8a30: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
8a40: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
8a50: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
8a60: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
8a70: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
8a80: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
8a90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8aa0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
8ab0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
8ac0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8ad0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
8ae0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8af0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8b00: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
8b10: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
8b20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
8b30: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
8b40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8b50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8b60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
8b70: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
8b80: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
8b90: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
8ba0: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
8bb0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
8bc0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
8bd0: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
8be0: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
8bf0: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
8c00: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
8c10: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
8c20: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
8c30: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
8c40: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
8c50: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8c60: 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
8c70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8c80: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
8c90: 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  p[cbrk], &data[c
8ca0: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
8cb0: 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b   - cbrk);.  cbrk
8cc0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
8cd0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
8ce0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
8cf0: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
8d00: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
8d10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
8d20: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
8d30: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
8d40: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
8d50: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
8d60: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
8d70: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
8d80: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
8d90: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65  e(pAddr);.    te
8da0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
8db0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
8dc0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
8dd0: 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65  lLast );.#if !de
8de0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8df0: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8e00: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20  L_CHECK).    /* 
8e10: 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  These conditions
8e20: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
8e30: 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62  en verified in b
8e40: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20  treeInitPage(). 
8e50: 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f     ** if SQLITE_
8e60: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
8e70: 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65  CELL_CHECK is de
8e80: 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20  fined .    */.  
8e90: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
8ea0: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
8eb0: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
8ec0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8ed0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
8ee0: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
8ef0: 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc>=iCellFirst
8f00: 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73   && pc<=iCellLas
8f10: 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  t );.    size = 
8f20: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
8f30: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
8f40: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
8f50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8f60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8f70: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8f80: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
8f90: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
8fa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8fb0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8fc0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
8fd0: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8fe0: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
8ff0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
9000: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9010: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9020: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
9030: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
9040: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
9050: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
9060: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9070: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
9080: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
9090: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
90a0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
90b0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
90c0: 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c  brk], &temp[pc],
90d0: 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32   size);.    put2
90e0: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
90f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
9100: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
9110: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
9120: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
9130: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
9140: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
9150: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
9160: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
9170: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
9180: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
9190: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
91a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
91b0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
91c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
91d0: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
91e0: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
91f0: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
9200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9210: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
9220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9230: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
9240: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
9250: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
9260: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
9270: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
9280: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
9290: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
92a0: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
92b0: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
92c0: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
92d0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
92e0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
92f0: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
9300: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
9310: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
9320: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
9330: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
9340: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
9350: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
9360: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
9370: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
9380: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
9390: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
93a0: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
93b0: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
93c0: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
93d0: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
93e0: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
93f0: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
9400: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
9410: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
9420: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
9430: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
9440: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
9450: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
9460: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
9470: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
9480: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
9490: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
94a0: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
94b0: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
94c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
94d0: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
94e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
94f0: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
9500: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
9510: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
9520: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
9530: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
9540: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
9550: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
9560: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9570: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
9580: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
9590: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  aData */.  int n
95a0: 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Frag;           
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61  /* Number of fra
95d0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e  gmented bytes on
95e0: 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
95f0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
9620: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
9630: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  rea */.  int gap
9640: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
9650: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
9660: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
9670: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
9680: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tent */.  int rc
9690: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
96a0: 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
96b0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
96c0: 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
96d0: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
96e0: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
96f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
9700: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
9710: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
9720: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9740: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9750: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9760: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9770: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
9780: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
9790: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
97a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
97b0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
97c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
97d0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75  erflow==0 );.  u
97e0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
97f0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9800: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42  ze;.  assert( nB
9810: 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65  yte < usableSize
9820: 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  -8 );..  nFrag =
9830: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
9840: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9850: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
9860: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
9870: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
9880: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9890: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
98a0: 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  ell;.  top = get
98b0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
98c0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
98d0: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
98e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
98f0: 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61  T_BKPT;.  testca
9900: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
9910: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
9920: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
9930: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
9940: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67   );..  if( nFrag
9950: 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  >=60 ){.    /* A
9960: 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74  lways defragment
9970: 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74   highly fragment
9980: 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ed pages */.    
9990: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
99a0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
99b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
99c0: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
99d0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
99e0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d  ata[hdr+5]);.  }
99f0: 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c 3d  else if( gap+2<=
9a00: 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  top ){.    /* Se
9a10: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
9a20: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
9a30: 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e  free slot big en
9a40: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
9a50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75  .    ** the requ
9a60: 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74  est. The allocat
9a70: 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d  ion is made from
9a80: 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
9a90: 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20  slot in .    ** 
9aa0: 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
9ab0: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
9ac0: 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a   accomadate it..
9ad0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70      */.    int p
9ae0: 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72  c, addr;.    for
9af0: 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63  (addr=hdr+1; (pc
9b00: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9b10: 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64  a[addr]))>0; add
9b20: 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74  r=pc){.      int
9b30: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
9b40: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
9b50: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
9b60: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
9b70: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64  eSize-4 || pc<ad
9b80: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  dr+4 ){.        
9b90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9ba0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9bb0: 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d    }.      size =
9bc0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9bd0: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
9be0: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
9bf0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
9c00: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
9c10: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9c20: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20   x==4 );.       
9c30: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
9c40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
9c50: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
9c60: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
9c70: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
9c80: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
9c90: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
9ca0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
9cb0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
9cc0: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
9cd0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
9ce0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
9cf0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
9d00: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
9d10: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
9d20: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
9d30: 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20  e if( size+pc > 
9d40: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
9d50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9d60: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9d70: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
9d80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
9d90: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
9da0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
9db0: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
9dc0: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
9dd0: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
9de0: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
9df0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
9e00: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
9e10: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
9e20: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
9e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9e40: 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a  *pIdx = pc + x;.
9e50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9e60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
9e70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
9e80: 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
9e90: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e  sure there is en
9ea0: 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68  ough space in th
9eb0: 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79  e gap to satisfy
9ec0: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61  .  ** the alloca
9ed0: 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64  tion.  If not, d
9ee0: 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  efragment..  */.
9ef0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
9f00: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
9f10: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
9f20: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20  e>top ){.    rc 
9f30: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
9f40: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
9f50: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9f60: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
9f70: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
9f80: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
9f90: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
9fa0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
9fb0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
9fc0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
9fd0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
9fe0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
9ff0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
a000: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a010: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
a020: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
a030: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
a040: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
a050: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
a060: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
a070: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
a080: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
a090: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
a0a0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
a0b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
a0c0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
a0d0: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
a0e0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
a0f0: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
a100: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
a110: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a120: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a130: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
a140: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
a150: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a160: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
a170: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
a180: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a190: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
a1a0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
a1b0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
a1c0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
a1d0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
a1e0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
a1f0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b   is pPage->aDisk
a200: 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  [start].** and t
a210: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
a220: 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62  lock is "size" b
a230: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
a240: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
a250: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
a260: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
a270: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
a280: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
a290: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
a2a0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a2b0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
a2c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73  ge *pPage, int s
a2d0: 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b  tart, int size){
a2e0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65  .  int addr, pbe
a2f0: 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20  gin, hdr;.  int 
a300: 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  iLast;          
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a320: 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   Largest possibl
a330: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  e freeblock offs
a340: 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  et */.  unsigned
a350: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
a360: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
a370: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
a380: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
a390: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
a3a0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
a3b0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
a3c0: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
a3d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
a3e0: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
a3f0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
a400: 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29  ( (start + size)
a410: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
a420: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a440: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
a450: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
a460: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
a470: 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20  size>=0 );   /* 
a480: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
a490: 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66 28  e is 4 */..  if(
a4a0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 73 65 63   pPage->pBt->sec
a4b0: 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ureDelete ){.   
a4c0: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
a4d0: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
a4e0: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
a4f0: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
a500: 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f  ete.    ** optio
a510: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
a520: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
a530: 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  [start], 0, size
a540: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
a550: 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20   the space back 
a560: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
a570: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
a580: 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  ks.  Note that. 
a590: 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
a5a0: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69  the freeblock li
a5b0: 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62  st was checked b
a5c0: 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  y btreeInitPage(
a5d0: 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e 69  ),.  ** btreeIni
a5e0: 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20  tPage() did not 
a5f0: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69  detect overlappi
a600: 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a  ng cells or.  **
a610: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
a620: 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c   overlapped cell
a630: 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74  s.   Nor does it
a640: 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65   detect when the
a650: 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65  .  ** cell conte
a660: 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20  nt area exceeds 
a670: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
a680: 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49   page header.  I
a690: 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74  f these.  ** sit
a6a0: 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74  uations arise, t
a6b0: 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69  hen subsequent i
a6c0: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
a6d0: 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20   might corrupt. 
a6e0: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
a6f0: 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64  .  So we do need
a700: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f   to check for co
a710: 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73  rruption while s
a720: 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65  canning.  ** the
a730: 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
a740: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
a750: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
a760: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c   = hdr + 1;.  iL
a770: 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ast = pPage->pBt
a780: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
a790: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
a7a0: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68  t<=iLast );.  wh
a7b0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
a7c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
a7d0: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
a7e0: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69  begin>0 ){.    i
a7f0: 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34  f( pbegin<addr+4
a800: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a810: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a820: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
a830: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
a840: 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e   }.  if( pbegin>
a850: 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74  iLast ){.    ret
a860: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a870: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
a880: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
a890: 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20  dr || pbegin==0 
a8a0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
a8b0: 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74  ata[addr], start
a8c0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
a8d0: 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67  ata[start], pbeg
a8e0: 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  in);.  put2byte(
a8f0: 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20  &data[start+2], 
a900: 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  size);.  pPage->
a910: 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e  nFree = pPage->n
a920: 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65  Free + (u16)size
a930: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
a940: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
a950: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
a960: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
a970: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
a980: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a990: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
a9a0: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20  t pnext, psize, 
a9b0: 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
a9c0: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
a9d0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
a9e0: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
a9f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
aa00: 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d  4 );.    pnext =
aa10: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
aa20: 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73  pbegin]);.    ps
aa30: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
aa40: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
aa50: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20  .    if( pbegin 
aa60: 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70  + psize + 3 >= p
aa70: 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20  next && pnext>0 
aa80: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61  ){.      int fra
aa90: 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65  g = pnext - (pbe
aaa0: 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20  gin+psize);.    
aab0: 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c    if( (frag<0) |
aac0: 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74  | (frag>(int)dat
aad0: 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20  a[hdr+7]) ){.   
aae0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aaf0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ab00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
ab10: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75  ata[hdr+7] -= (u
ab20: 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20  8)frag;.      x 
ab30: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ab40: 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20  [pnext]);.      
ab50: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
ab60: 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20  begin], x);.    
ab70: 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65    x = pnext + ge
ab80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
ab90: 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b  xt+2]) - pbegin;
aba0: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
abb0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
abc0: 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   x);.    }else{.
abd0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65        addr = pbe
abe0: 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  gin;.    }.  }..
abf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
ac00: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65   content area be
ac10: 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65  gins with a free
ac20: 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74  block, remove it
ac30: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b  . */.  if( data[
ac40: 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+1]==data[hdr
ac50: 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b  +5] && data[hdr+
ac60: 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20  2]==data[hdr+6] 
ac70: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a  ){.    int top;.
ac80: 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74      pbegin = get
ac90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
aca0: 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1]);.    memcpy(
acb0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64  &data[hdr+1], &d
acc0: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b  ata[pbegin], 2);
acd0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
ace0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
acf0: 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  ) + get2byte(&da
ad00: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
ad10: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
ad20: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
ad30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
ad40: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ad50: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
ad60: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
ad70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ad80: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
ad90: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
ada0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
adb0: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
adc0: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
add0: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
ade0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
adf0: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
ae00: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
ae10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
ae20: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
ae30: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
ae40: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
ae50: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
ae60: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
ae70: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
ae80: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
ae90: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
aea0: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
aeb0: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
aec0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
aed0: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
aee0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
aef0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
af00: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
af10: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
af20: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
af30: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
af40: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
af50: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
af60: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
af70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
af80: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
af90: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
afa0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
afb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
afc0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
afd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
afe0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
aff0: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
b000: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
b010: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
b020: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
b030: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
b040: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
b050: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
b060: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
b070: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
b080: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
b090: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
b0a0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
b0b0: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
b0c0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
b0d0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
b0e0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b0f0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
b100: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
b110: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
b120: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
b130: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
b140: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
b150: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
b160: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
b170: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
b180: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
b190: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
b1a0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
b1b0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
b1c0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
b1d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b1e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
b1f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b200: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
b210: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
b220: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
b230: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
b240: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
b250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
b260: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
b270: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b280: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
b290: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
b2a0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
b2b0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
b2c0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
b2d0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
b2e0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
b2f0: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
b300: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
b310: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
b320: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
b330: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
b340: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
b350: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
b360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b370: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65  btreeInitPage(Me
b380: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a  mPage *pPage){..
b390: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b3a0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
b3b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b3c0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b3d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b3e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
b3f0: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
b400: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
b410: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b420: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
b430: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
b440: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
b450: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
b460: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
b470: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b480: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
b490: 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66  DbPage) );..  if
b4a0: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
b4b0: 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20   ){.    u16 pc; 
b4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
b4d0: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
b4e0: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
b4f0: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
b500: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
b510: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
b520: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
b530: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
b540: 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
b550: 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
b560: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
b570: 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
b580: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
b590: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
b5a0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e  ucture */.    in
b5b0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
b5c0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
b5d0: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
b5e0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75  ch page */.    u
b5f0: 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  16 cellOffset;  
b600: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
b610: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
b620: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
b630: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
b640: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
b650: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
b660: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
b670: 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  page */.    int 
b680: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
b690: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
b6a0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b6b0: 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74   area */.    int
b6c0: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b6d0: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
b6e0: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
b6f0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
b700: 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74     int iCellLast
b710: 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f  ;     /* Last po
b720: 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  ssible cell or f
b730: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
b740: 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50  */..    pBt = pP
b750: 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68  age->pBt;..    h
b760: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b770: 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20  ffset;.    data 
b780: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b790: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
b7a0: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
b7b0: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
b7c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b7d0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
b7e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
b7f0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
b800: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
b810: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
b820: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
b830: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
b840: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
b850: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
b860: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
b870: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
b880: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
b890: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
b8a0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
b8b0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70  e->leaf;.    top
b8c0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
b8d0: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
b8e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
b8f0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
b900: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
b910: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
b920: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
b930: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
b940: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
b950: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
b960: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
b970: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
b980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b990: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
b9a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b9b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
b9c0: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20  CELL(pBt) );..  
b9d0: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
b9e0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
b9f0: 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f  ight cause us to
ba00: 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
ba10: 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67  nd.    ** of pag
ba20: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
ba30: 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a   cell.  .    **.
ba40: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
ba50: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  wing block of co
ba60: 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20  de checks early 
ba70: 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c  to see if a cell
ba80: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20   extends.    ** 
ba90: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
baa0: 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20  a page boundary 
bab0: 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54  and causes SQLIT
bac0: 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20  E_CORRUPT to be 
bad0: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  .    ** returned
bae0: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20   if it does..   
baf0: 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72   */.    iCellFir
bb00: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
bb10: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
bb20: 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20  ;.    iCellLast 
bb30: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
bb40: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
bb50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
bb60: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
bb70: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
bb80: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
bb90: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
bba0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
bbb0: 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ray */.      int
bbc0: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
bbd0: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
bbe0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
bbf0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
bc00: 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20  ellLast--;.     
bc10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
bc20: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
bc30: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
bc40: 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
bc50: 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
bc60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bc70: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
bc80: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bc90: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
bca0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
bcb0: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
bcc0: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
bcd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
bce0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bcf0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
bd00: 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63  }.        sz = c
bd10: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
bd20: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
bd30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd40: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
bd50: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
bd60: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
bd70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
bd80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bd90: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
bda0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bdb0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
bdc0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
bdd0: 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69  +;.    }  .#endi
bde0: 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  f..    /* Comput
bdf0: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
be00: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
be10: 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  ge */.    pc = g
be20: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
be30: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
be40: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
be50: 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28   top;.    while(
be60: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
be70: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
be80: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
be90: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
bea0: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
beb0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72    /* Start of fr
bec0: 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20  ee block is off 
bed0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
bee0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bef0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
bf00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
bf10: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
bf20: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
bf30: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
bf40: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
bf50: 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30       if( (next>0
bf60: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
bf70: 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  e+3) || pc+size>
bf80: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
bf90: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
bfa0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
bfb0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
bfc0: 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79   And the last by
bfd0: 74 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72  te of..** the fr
bfe0: 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69  ee-block must li
bff0: 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
c000: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
c010: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c020: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
c040: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
c050: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
c060: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
c070: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
c080: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
c090: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
c0a0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c0b0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
c0c0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c0d0: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
c0e0: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
c0f0: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
c100: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c110: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
c120: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c130: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
c140: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
c150: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
c160: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
c170: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
c180: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
c190: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
c1a0: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
c1b0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
c1c0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
c1d0: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
c1e0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
c1f0: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
c200: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
c210: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
c220: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
c230: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c240: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c250: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
c260: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c270: 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
c280: 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
c290: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c2a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c2b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c2c0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c2d0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c2e0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c2f0: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c300: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c310: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c320: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c330: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c340: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c350: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c360: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c370: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c380: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
c390: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c3a0: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
c3b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c3c0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
c3d0: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
c3e0: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
c3f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c400: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
c410: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
c420: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
c430: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
c440: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c450: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
c460: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
c470: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c480: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
c490: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c4a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c4b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
c4c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
c4d0: 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72    if( pBt->secur
c4e0: 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d  eDelete ){.    m
c4f0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
c500: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
c510: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
c520: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
c530: 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
c540: 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  rst = hdr + 8 + 
c550: 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  4*((flags&PTF_LE
c560: 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20  AF)==0 ?1:0);.  
c570: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
c580: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
c590: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
c5a0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c5b0: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
c5c0: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
c5d0: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c5e0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
c5f0: 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
c600: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
c610: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
c620: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
c630: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
c640: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
c650: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
c660: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
c670: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
c680: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
c690: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
c6a0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
c6b0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
c6c0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
c6d0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
c6e0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
c6f0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
c700: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
c710: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
c720: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
c730: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
c740: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
c750: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
c760: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
c770: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
c780: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
c790: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
c7a0: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
c7b0: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
c7c0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
c7d0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
c7e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
c7f0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
c800: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
c810: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
c820: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
c830: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
c840: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
c850: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
c860: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
c870: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
c880: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
c890: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
c8a0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
c8b0: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
c8c0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
c8d0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
c8e0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
c8f0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
c900: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
c910: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
c920: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
c930: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
c940: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
c950: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
c960: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
c970: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
c980: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
c990: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
c9a0: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
c9b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
c9c0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
c9d0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
c9e0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
c9f0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
ca00: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
ca10: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
ca20: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
ca30: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
ca40: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
ca50: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
ca60: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
ca70: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
ca80: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
ca90: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
caa0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
cab0: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
cac0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
cad0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cae0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
caf0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
cb00: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
cb10: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
cb20: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
cb30: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  eter */.  int no
cb40: 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f  Content        /
cb50: 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61  * Do not load pa
cb60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ge content if tr
cb70: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
cb80: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
cb90: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
cba0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cbb0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
cbc0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
cbd0: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
cbe0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
cbf0: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
cc00: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
cc10: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
cc20: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
cc30: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
cc40: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
cc50: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
cc60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cc70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
cc80: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
cc90: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
cca0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
ccb0: 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
ccc0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
ccd0: 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
cce0: 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
ccf0: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
cd00: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
cd10: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
cd20: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
cd30: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
cd40: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
cd50: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
cd60: 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
cd70: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
cd80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cd90: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
cda0: 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
cdb0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
cdc0: 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
cdd0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
cde0: 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
cdf0: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
ce00: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
ce10: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
ce20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ce30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ce40: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
ce50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
ce60: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
ce70: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
ce80: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
ce90: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
cea0: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
ceb0: 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
cec0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
ced0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
cee0: 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
cef0: 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
cf00: 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
cf10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
cf20: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
cf30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
cf40: 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
cf50: 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  0x8000000)==0 );
cf60: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62  .  return (int)b
cf70: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
cf80: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
cf90: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
cfa0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
cfb0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
cfc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
cfd0: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
cfe0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
cff0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
d000: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
d010: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
d020: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
d030: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d040: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
d050: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
d060: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
d070: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
d080: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
d090: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
d0a0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
d0b0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
d0c0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
d0d0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
d0e0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
d0f0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d100: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d110: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
d120: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
d130: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
d140: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
d150: 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e     /* Write t
d160: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
d170: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
d180: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
d190: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d1a0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d1b0: 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
d1c0: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
d1d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
d1e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d1f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
d200: 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
d210: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
d220: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
d230: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d240: 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
d250: 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
d260: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
d270: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d280: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
d290: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
d2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d2b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
d2c0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d2d0: 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
d2e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
d2f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d300: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
d310: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
d320: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
d330: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
d340: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
d350: 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
d360: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
d370: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
d380: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
d390: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73   pPage ){.    as
d3a0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
d3b0: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
d3c0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
d3d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d3e0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
d3f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d400: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
d410: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d420: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
d430: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
d440: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
d450: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d460: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d470: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d480: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71  mutex) );.    sq
d490: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
d4a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
d4b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75  .  }.}../*.** Du
d4c0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
d4d0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
d4e0: 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
d4f0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
d500: 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
d510: 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
d520: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
d530: 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
d540: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
d550: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
d560: 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
d570: 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
d580: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
d590: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d5a0: 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
d5b0: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
d5c0: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
d5d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
d5e0: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
d5f0: 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
d600: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d610: 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
d620: 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
d630: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
d640: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
d650: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
d660: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
d670: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d680: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
d690: 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
d6a0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
d6b0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
d6c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d6d0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d6e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
d6f0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
d700: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
d710: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
d720: 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
d730: 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
d740: 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
d750: 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
d760: 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
d770: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
d780: 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
d790: 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
d7a0: 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
d7b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
d7c0: 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
d7d0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
d7e0: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
d7f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
d800: 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
d810: 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
d820: 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
d830: 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
d840: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
d850: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
d860: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
d870: 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
d880: 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
d890: 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
d8a0: 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
d8b0: 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
d8c0: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
d8d0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
d8e0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
d8f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
d900: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
d910: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
d920: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
d930: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
d940: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
d950: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
d960: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
d970: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
d980: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
d990: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d9a0: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
d9b0: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
d9c0: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
d9d0: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
d9e0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
d9f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
da00: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
da10: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
da20: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
da30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
da40: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
da50: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
da60: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
da70: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
da80: 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
da90: 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
daa0: 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
dab0: 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
dac0: 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
dad0: 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
dae0: 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
daf0: 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
db00: 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
db10: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
db20: 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
db30: 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
db40: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
db50: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
db60: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
db70: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
db80: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
db90: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
dba0: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
dbb0: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
dbc0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
dbd0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
dbe0: 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
dbf0: 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
dc00: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
dc10: 69 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  its.** BTREE_OMI
dc20: 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
dc30: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
dc40: 43 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e  CK.  The BTREE_N
dc50: 4f 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69  O_READLOCK.** bi
dc60: 74 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66  t is also set if
dc70: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65   the SQLITE_NoRe
dc80: 61 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20  adlock flags is 
dc90: 73 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73  set in db->flags
dca0: 2e 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73  ..** These flags
dcb0: 20 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f   are passed thro
dcc0: 75 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33  ugh into sqlite3
dcd0: 50 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20  PagerOpen() and 
dce0: 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73  must.** be the s
dcf0: 61 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41  ame values as PA
dd00: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
dd10: 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45   and PAGER_NO_RE
dd20: 41 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ADLOCK..**.** If
dd30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
dd40: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
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 0a  base connection.
dd70: 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e  ** and we are in
dd80: 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f   shared cache mo
dd90: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65  de, then the ope
dda0: 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  n will fail with
ddb0: 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   an.** SQLITE_CO
ddc0: 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20  NSTRAINT error. 
ddd0: 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   We cannot allow
dde0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53   two or more BtS
ddf0: 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73  hared.** objects
de00: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
de10: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
de20: 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
de30: 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20  will lead.** to 
de40: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f  problems with lo
de50: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
de60: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
de70: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
de80: 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53  Vfs,      /* VFS
de90: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
dea0: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e   b-tree */.  con
deb0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
dec0: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
ded0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
dee0: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
def0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
df00: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
df10: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
df20: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
df30: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
df40: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
df50: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
df60: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
df70: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
df80: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
df90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
dfa0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
dfb0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
dfc0: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
dfd0: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
dfe0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
dff0: 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
e000: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20  *pBt = 0;       
e010: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
e020: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
e030: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
e040: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
e050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
e060: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
e070: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
e080: 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20  ex *mutexOpen = 
e090: 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20  0;  /* Prevents 
e0a0: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
e0b0: 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a  . Ticket #3537 *
e0c0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e0d0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e0e0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
e0f0: 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  e from this func
e100: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65  tion */.  u8 nRe
e110: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
e120: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e130: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e140: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
e150: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
e160: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
e170: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
e180: 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ader content */.
e190: 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70  .  /* True if op
e1a0: 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ening an ephemer
e1b0: 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61  al, temporary da
e1c0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
e1d0: 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d  t int isTempDb =
e1e0: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
e1f0: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30   zFilename[0]==0
e200: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
e210: 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
e220: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
e230: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e240: 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
e250: 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
e260: 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  sed database..  
e270: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
e280: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
e290: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
e2a0: 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  db = 0;.#else.  
e2b0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
e2c0: 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26  b = (zFilename &
e2d0: 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  & strcmp(zFilena
e2e0: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  me, ":memory:")=
e2f0: 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
e300: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69             || (i
e310: 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74  sTempDb && sqlit
e320: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
e330: 62 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  b));.#endif..  a
e340: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
e350: 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
e360: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e370: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e380: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
e390: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e3a0: 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
e3b0: 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
e3c0: 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
e3d0: 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
e3e0: 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
e3f0: 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
e400: 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
e410: 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
e420: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
e430: 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
e440: 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
e450: 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
e460: 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
e470: 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
e480: 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
e490: 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
e4a0: 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
e4b0: 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
e4c0: 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
e4d0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
e4e0: 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b  QLITE_NoReadlock
e4f0: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
e500: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
e510: 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  CK;.  }.  if( is
e520: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
e530: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
e540: 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
e550: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
e560: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
e570: 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
e580: 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
e590: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
e5a0: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
e5b0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
e5c0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
e5d0: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
e5e0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e5f0: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
e600: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
e610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e620: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
e630: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
e640: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
e650: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
e660: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e670: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
e680: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
e690: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
e6a0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
e6b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e6c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e6d0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e6e0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e6f0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
e700: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
e710: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
e720: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
e730: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
e740: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
e750: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
e760: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
e770: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
e780: 3d 30 20 26 26 20 69 73 54 65 6d 70 44 62 3d 3d  =0 && isTempDb==
e790: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  0 ){.    if( vfs
e7a0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
e7b0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
e7c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
e7d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
e7e0: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
e7f0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
e800: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e810: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
e820: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e830: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
e840: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
e850: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
e860: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
e870: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e890: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
e8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e8b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
e8c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
e8d0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
e8e0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
e8f0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
e900: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
e910: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
e920: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
e930: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
e940: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
e950: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e960: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
e970: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
e980: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e990: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e9a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
e9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e9c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
e9d0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
e9e0: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
e9f0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ea00: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ea10: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
ea20: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
ea30: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
ea40: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
ea50: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
ea60: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
ea70: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
ea80: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20  (pBt->pPager)). 
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
eab0: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
eac0: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
ead0: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
eae0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
eaf0: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
eb00: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
eb10: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
eb20: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
eb30: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
eb40: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
eb50: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
eb60: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
eb80: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
eb90: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ebb0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ebc0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
ebd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ebe0: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
ebf0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
ec00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ec10: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
ec20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ec30: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
ec40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ec50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec60: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
ec70: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
ec80: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
ec90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
eca0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ecb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ecc0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
ecd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ece0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ecf0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
ed00: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ed10: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
ed20: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
ed30: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
ed40: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
ed50: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
ed60: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
ed70: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
ed80: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
ed90: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
eda0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
edb0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
edc0: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
edd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ede0: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
edf0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
ee00: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
ee10: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
ee20: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
ee30: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
ee40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
ee50: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
ee60: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
ee70: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
ee80: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
ee90: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
eea0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
eeb0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
eec0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
eed0: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
eee0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
eef0: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
ef00: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
ef10: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
ef20: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
ef30: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ef40: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
ef50: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
ef60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ef70: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
ef80: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
ef90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
efa0: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
efb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
efc0: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
efd0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
efe0: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
eff0: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
f000: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
f010: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
f020: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
f030: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f040: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f050: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f060: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
f070: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f080: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
f090: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
f0a0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
f0c0: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
f0d0: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
f0e0: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
f0f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f100: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f110: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
f120: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
f130: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
f140: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
f150: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f160: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f170: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
f180: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
f190: 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
f1a0: 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
f1b0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
f1c0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
f1d0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
f1e0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
f1f0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
f200: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
f210: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
f220: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
f230: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
f240: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
f250: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
f260: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
f270: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
f280: 67 65 72 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ger);.#ifdef SQL
f290: 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
f2a0: 45 0a 20 20 20 20 70 42 74 2d 3e 73 65 63 75 72  E.    pBt->secur
f2b0: 65 44 65 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e  eDelete = 1;.#en
f2c0: 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  dif.    pBt->pag
f2d0: 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
f2e0: 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
f2f0: 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
f300: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
f310: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
f320: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
f330: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
f340: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
f350: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
f360: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
f370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
f380: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
f390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3a0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f3b0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
f3c0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
f3d0: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
f3e0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
f3f0: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
f400: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
f410: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
f420: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
f430: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
f440: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
f450: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f460: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
f470: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
f480: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
f490: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
f4a0: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
f4b0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
f4c0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
f4d0: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
f4e0: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
f4f0: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
f500: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
f510: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
f520: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
f530: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
f540: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
f550: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
f560: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
f570: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
f580: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
f590: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f5a0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
f5b0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
f5c0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
f5d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
f5e0: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
f5f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
f600: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
f610: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
f620: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
f630: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
f640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f650: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
f660: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
f670: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
f680: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
f690: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
f6a0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
f6b0: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
f6c0: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
f6d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
f6e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f6f0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
f700: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
f710: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
f720: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
f730: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
f740: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
f750: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
f760: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f770: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
f780: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
f790: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
f7a0: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
f7b0: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
f7c0: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
f7d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f7e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f7f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f800: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f810: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
f820: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
f830: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
f840: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
f850: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
f860: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
f870: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
f880: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
f890: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
f8a0: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
f8b0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
f8c0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f8d0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f8e0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
f8f0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
f900: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
f910: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
f920: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
f930: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
f940: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
f950: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
f960: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
f970: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
f980: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
f990: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f9a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
f9b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f9c0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
f9d0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
f9e0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
f9f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
fa00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fa10: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
fa20: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
fa30: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
fa40: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fa50: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
fa60: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
fa70: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fa80: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
fa90: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
faa0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
fab0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
fac0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
fad0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fae0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
faf0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
fb00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
fb10: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
fb20: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
fb30: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
fb40: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
fb50: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
fb60: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
fb70: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
fb80: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
fb90: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
fba0: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
fbb0: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
fbc0: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
fbd0: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
fbe0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
fbf0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
fc00: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
fc10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
fc20: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
fc30: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
fc40: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
fc50: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
fc60: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
fc70: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
fc80: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
fc90: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
fca0: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
fcb0: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
fcc0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
fcd0: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
fce0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
fcf0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
fd00: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
fd10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fd20: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
fd30: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
fd40: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
fd50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
fd60: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
fd70: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
fd80: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
fd90: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
fda0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
fdb0: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
fdc0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
fdd0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
fde0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
fdf0: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
fe00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
fe10: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
fe20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fe30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
fe40: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
fe50: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
fe60: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
fe70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fe80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
fe90: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
fea0: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
feb0: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
fec0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
fed0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
fee0: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
fef0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
ff00: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
ff10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
ff20: 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
ff30: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
ff40: 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
ff50: 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
ff60: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
ff70: 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
ff80: 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
ff90: 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
ffa0: 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
ffb0: 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
ffc0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
ffd0: 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
ffe0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
fff0: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
10000 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
10010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
10020 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
10030 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
10040 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
10050 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
10060 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
10070 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
10080 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10090 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
100a0 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
100b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
100c0 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
100d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
100e0 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
100f0 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
10100 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
10110 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
10120 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
10130 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
10140 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
10150 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
10160 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
10170 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
10180 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
10190 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
101a0 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
101b0 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
101c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
101d0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
101e0 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
101f0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10200 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
10210 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  CHE.  sqlite3_mu
10220 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  tex *pMaster;.  
10230 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
10240 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
10250 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
10260 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
10270 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10280 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   );.  pMaster = 
10290 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
102a0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
102b0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
102c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
102d0 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
102e0 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
102f0 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
10300 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
10310 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10320 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10330 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
10340 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
10350 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10360 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
10370 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
10380 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
10390 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
103a0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
103b0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
103c0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
103d0 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
103e0 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
103f0 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
10400 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10410 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10420 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10430 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10440 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10460 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10470 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
10480 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10490 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
104a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
104b0 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
104c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
104d0 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
104e0 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
104f0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
10500 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10510 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10520 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10530 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10540 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10550 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
10560 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10570 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
10580 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
10590 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
105a0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
105b0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
105c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
105d0 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
105e0 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
105f0 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
10600 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
10610 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10620 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
10630 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10640 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
10650 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
10660 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
10670 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
10680 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
10690 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
106a0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
106b0 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
106c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
106d0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
106e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
106f0 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
10700 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
10710 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10720 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10730 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10740 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10750 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
10760 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
10770 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10780 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
10790 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
107a0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
107b0 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
107c0 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
107d0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
107e0 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
107f0 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
10800 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10810 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10820 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10830 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10840 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10850 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
10860 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
10870 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
10880 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10890 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
108a0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
108b0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
108c0 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
108d0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
108e0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
108f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
10900 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10910 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
10920 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
10930 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
10940 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
10950 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
10960 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
10970 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
10980 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
10990 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
109a0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
109b0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
109c0 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
109d0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
109e0 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
109f0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10a00 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
10a10 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
10a20 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
10a30 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
10a40 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
10a50 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
10a60 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
10a70 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
10a80 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
10a90 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
10aa0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10ac0 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
10ad0 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
10ae0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10af0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10b00 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
10b10 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
10b20 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
10b30 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
10b40 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
10b50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
10b60 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
10b70 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
10b80 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10b90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10ba0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
10bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10bc0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
10bd0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10be0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
10bf0 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
10c00 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
10c10 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
10c20 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
10c30 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
10c40 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
10c50 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
10c60 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
10c70 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
10c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10c90 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10ca0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
10cb0 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
10cc0 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
10cd0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
10ce0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
10cf0 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
10d00 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
10d10 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
10d20 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
10d30 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10d40 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
10d50 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
10d60 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
10d70 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
10d80 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
10d90 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
10da0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
10db0 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
10dc0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
10dd0 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
10de0 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
10df0 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
10e00 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
10e10 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
10e20 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
10e30 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
10e40 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
10e50 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
10e60 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
10e70 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
10e80 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
10e90 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
10ea0 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
10eb0 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
10ec0 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
10ed0 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
10ee0 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
10ef0 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
10f00 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
10f10 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
10f20 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
10f30 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
10f40 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
10f50 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
10f60 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
10f70 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
10f80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10f90 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
10fa0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10fb0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10fc0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10fd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
10fe0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
10ff0 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
11000 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
11010 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11020 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11030 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11040 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
11050 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
11060 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
11070 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
11080 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
11090 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
110a0 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
110b0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
110c0 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
110d0 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
110e0 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
110f0 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
11100 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
11110 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
11120 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
11130 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
11140 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
11150 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
11160 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
11170 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
11180 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11190 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
111a0 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
111b0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
111c0 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
111d0 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
111e0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
111f0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
11200 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
11210 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
11220 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11230 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42  SafetyLevel(.  B
11240 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
11250 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
11260 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
11270 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
11280 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20  .  int level,   
11290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
112a0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
112b0 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
112c0 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69  L, 3=FULL */.  i
112d0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20  nt fullSync,    
112e0 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
112f0 66 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20  fullfsync. */.  
11300 69 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63  int ckptFullSync
11310 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
11320 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
11330 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  fync */.){.  BtS
11340 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11350 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
11360 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11370 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  );.  assert( lev
11390 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
113a0 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  3 );.  sqlite3Bt
113b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
113c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
113d0 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
113e0 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
113f0 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c  llSync, ckptFull
11400 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
11410 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11430 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
11440 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11450 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
11460 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
11470 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
11480 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
11490 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
114a0 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
114b0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
114c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
114d0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
114e0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
114f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11500 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11510 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11520 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11530 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
11540 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
11550 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
11560 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
11570 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
11580 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
11590 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
115a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
115b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
115c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
115d0 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
115e0 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
115f0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
11600 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
11610 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
11620 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
11630 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11640 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
11650 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
11660 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
11670 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
11680 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
11690 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
116a0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
116b0 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
116c0 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
116d0 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
116e0 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
116f0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
11700 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
11710 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
11720 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
11730 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
11740 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
11750 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
11760 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
11770 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11780 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
11790 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
117a0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
117b0 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
117c0 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
117d0 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
117e0 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
117f0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
11800 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
11810 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
11820 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
11830 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
11840 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
11850 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
11860 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
11870 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
11880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
11890 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
118a0 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c  pageSizeFixed fl
118b0 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
118c0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
118d0 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
118e0 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
118f0 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
11900 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11910 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
11920 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
11930 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
11940 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
11950 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11960 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
11970 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11980 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11990 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
119a0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
119b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
119c0 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
119d0 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
119e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
119f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
11a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11a10 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
11a20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
11a30 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
11a40 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
11a50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
11a60 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
11a70 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
11a80 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
11a90 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
11aa0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
11ab0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
11ac0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
11ad0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11ae0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
11af0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
11b00 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
11b10 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
11b20 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
11b30 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
11b40 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
11b50 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
11b60 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
11b70 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
11b80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
11b90 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
11ba0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
11bb0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
11bc0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11bd0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
11be0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
11bf0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
11c00 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
11c10 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
11c20 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11c40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11c50 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
11c60 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
11c70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
11c80 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
11c90 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
11ca0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
11cb0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
11cc0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
11cd0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
11ce0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11cf0 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
11d00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
11d10 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
11d20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
11d30 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
11d40 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
11d50 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
11d60 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
11d70 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
11d80 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
11d90 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
11da0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
11db0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11dc0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
11dd0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
11de0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11df0 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
11e00 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
11e10 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
11e20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11e30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11e40 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
11e50 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
11e60 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
11e70 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
11e80 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
11e90 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
11ea0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
11eb0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
11ec0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
11ed0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
11ee0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
11ef0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
11f00 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
11f10 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
11f20 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
11f30 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
11f40 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
11f50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11f60 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
11f70 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
11f80 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
11f90 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
11fa0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11fb0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
11fc0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
11fd0 75 72 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69  ureDelete flag i
11fe0 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
11ff0 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
12000 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
12010 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
12020 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
12030 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12040 20 73 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a   secureDelete.**
12050 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
12060 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
12070 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12080 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
12090 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
120a0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
120b0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
120c0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
120d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
120e0 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
120f0 20 20 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72     p->pBt->secur
12100 65 44 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c  eDelete = (newFl
12110 61 67 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a  ag!=0) ? 1 : 0;.
12120 20 20 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42    } .  b = p->pB
12130 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b  t->secureDelete;
12140 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12150 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12160 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n b;.}.#endif /*
12170 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12180 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
12190 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
121a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
121b0 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
121c0 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
121d0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
121e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
121f0 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
12200 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
12210 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
12220 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
12230 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
12240 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
12250 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
12260 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
12270 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
12280 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
12290 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
122a0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
122b0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
122c0 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
122d0 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
122e0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
122f0 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
12300 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12310 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12320 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12330 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
12340 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12350 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
12360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12370 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
12380 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
12390 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
123a0 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
123b0 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20  ageSizeFixed && 
123c0 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
123d0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
123e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
123f0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
12400 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
12410 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
12420 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
12430 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
12440 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
12450 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12460 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
12470 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
12480 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
12490 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
124a0 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
124b0 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
124c0 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
124d0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
124e0 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
124f0 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
12500 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
12510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12520 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12530 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
12540 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
12550 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
12560 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12570 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
12580 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
12590 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
125a0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
125b0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
125c0 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
125d0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
125e0 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
125f0 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
12600 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12610 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12620 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
12630 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
12640 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
12650 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12660 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
12670 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
12680 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
12690 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
126a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
126b0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
126c0 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
126d0 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
126e0 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
126f0 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
12700 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
12710 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
12720 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
12730 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
12740 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
12750 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
12760 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
12770 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
12780 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
12790 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
127a0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
127b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
127c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
127d0 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
127e0 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
127f0 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
12800 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
12810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
12820 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
12830 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12840 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
12850 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
12860 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
12870 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
12880 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
12890 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
128a0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
128b0 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
128c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
128d0 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
128e0 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
128f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12900 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12910 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12920 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
12930 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
12940 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
12950 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
12960 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12970 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12980 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
12990 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
129a0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
129b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
129c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
129d0 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
129e0 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
129f0 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
12a00 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
12a10 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
12a20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
12a30 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
12a40 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
12a50 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
12a60 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
12a70 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12a80 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
12a90 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
12aa0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
12ab0 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
12ac0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
12ad0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12ae0 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
12af0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
12b00 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
12b10 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
12b20 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
12b30 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
12b40 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
12b50 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
12b60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12b70 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
12b80 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
12b90 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
12ba0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12bb0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12bc0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
12bd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12be0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
12bf0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
12c00 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
12c10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
12c20 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
12c30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12c40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12c50 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
12c60 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
12c70 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12c80 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12c90 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
12ca0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12cb0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12cc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12cd0 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
12ce0 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
12cf0 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
12d00 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
12d10 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
12d20 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
12d30 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
12d40 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
12d50 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
12d60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12d70 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
12d80 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
12d90 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
12da0 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
12db0 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
12dc0 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
12dd0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
12de0 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
12df0 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
12e00 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
12e10 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
12e20 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
12e30 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
12e40 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
12e50 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
12e60 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
12e70 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
12e80 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
12e90 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
12ea0 32 20 26 26 20 70 42 74 2d 3e 64 6f 4e 6f 74 55  2 && pBt->doNotU
12eb0 73 65 57 41 4c 3d 3d 30 20 29 7b 0a 20 20 20 20  seWAL==0 ){.    
12ec0 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
12ed0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12ee0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
12ef0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
12f00 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
12f10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12f20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12f30 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
12f40 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
12f50 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
12f60 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
12f70 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
12f80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12f90 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
12fa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12fb0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
12fc0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
12fd0 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
12fe0 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
12ff0 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
13000 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
13010 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
13020 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13030 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
13040 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
13050 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
13060 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
13070 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
13080 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
13090 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
130a0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
130b0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
130c0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
130d0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
130e0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
130f0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
13100 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
13110 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13120 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13130 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
13140 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
13150 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
13160 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
13170 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
13180 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
13190 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
131a0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
131b0 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
131c0 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
131d0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
131e0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
131f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
13200 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13210 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
13220 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
13230 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
13240 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
13250 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
13260 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
13270 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
13280 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
13290 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
132a0 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
132b0 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
132c0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
132d0 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
132e0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
132f0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
13300 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
13310 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
13320 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
13330 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
13340 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
13350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
13360 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
13370 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
13380 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
13390 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
133a0 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
133b0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
133c0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
133d0 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
133e0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
133f0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
13400 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
13410 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
13420 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13440 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
13450 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
13460 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
134a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
134b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
134c0 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
134d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
134e0 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
134f0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
13500 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
13510 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13520 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
13530 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13540 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
13550 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
13560 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
13570 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
13590 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
135a0 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
135b0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
135c0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
135d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
135e0 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
135f0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
13600 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
13610 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
13620 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13630 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13640 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
13650 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
13660 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
13670 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
13680 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
13690 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
136a0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
136b0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
136c0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
136d0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
136e0 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
136f0 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
13700 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
13710 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
13720 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
13730 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
13740 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
13750 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
13760 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
13770 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
13780 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
13790 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
137a0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
137b0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
137c0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
137d0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
137e0 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
137f0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
13800 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
13810 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
13820 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
13830 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
13840 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
13850 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
13860 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
13870 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
13880 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
13890 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
138a0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
138b0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
138c0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
138d0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
138e0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
138f0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
13900 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
13910 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
13920 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
13930 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
13940 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
13950 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
13960 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
13970 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13980 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
13990 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
139a0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
139b0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
139c0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
139d0 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
139e0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
139f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13a00 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
13a10 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
13a20 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13a30 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13a40 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
13a50 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
13a60 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
13a70 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
13a80 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
13a90 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
13aa0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
13ab0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
13ac0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
13ad0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
13ae0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
13af0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
13b00 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
13b10 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
13b20 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
13b30 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
13b40 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
13b50 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
13b60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13b70 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
13b80 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13b90 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
13ba0 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
13bb0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
13bc0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
13bd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13be0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13c00 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
13c10 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13c20 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
13c30 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
13c40 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13c50 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
13c60 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
13c70 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
13c80 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
13c90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13ca0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
13cb0 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
13cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13cd0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
13ce0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
13cf0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
13d00 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
13d10 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
13d20 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
13d30 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
13d40 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
13d50 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
13d60 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
13d70 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
13d80 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
13d90 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
13da0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
13db0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
13dc0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
13dd0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
13de0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
13df0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
13e00 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
13e10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13e20 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
13e30 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
13e40 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
13e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13e60 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
13e70 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
13e80 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
13e90 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
13ea0 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
13eb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
13ec0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
13ed0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13ee0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
13ef0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
13f00 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
13f10 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
13f20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
13f30 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
13f40 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
13f50 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
13f60 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
13f70 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
13f80 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
13f90 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
13fa0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
13fb0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
13fc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
13fd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
13fe0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13ff0 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
14000 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
14010 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
14020 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
14030 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
14040 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
14050 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
14060 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
14070 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
14080 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
14090 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
140a0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
140b0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
140c0 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  .  pBt->pageSize
140d0 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
140e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
140f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
14100 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
14110 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
14120 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
14130 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
14140 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
14150 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
14160 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
14170 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
14180 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
14190 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
141a0 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
141b0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
141c0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
141d0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
141e0 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
141f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14200 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
14210 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
14220 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
14230 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
14240 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
14250 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14260 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
14270 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
14280 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
14290 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
142a0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
142b0 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
142c0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
142d0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
142e0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
142f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
14300 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
14310 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
14320 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
14330 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
14340 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
14350 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
14360 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
14370 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
14380 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
14390 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
143a0 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
143b0 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
143c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
143d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
143e0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
143f0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
14400 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
14410 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
14420 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
14430 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
14440 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
14450 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
14460 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
14470 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
14480 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
14490 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
144a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
144b0 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
144c0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
144d0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
144e0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
144f0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
14500 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14510 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
14520 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14530 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
14540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
14550 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
14560 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
14570 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
14580 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
14590 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
145a0 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
145b0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
145c0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
145d0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
145e0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
145f0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
14600 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
14610 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
14620 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
14630 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
14640 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
14650 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
14660 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
14670 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
14680 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
14690 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
146a0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
146b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
146c0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
146d0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
146e0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
146f0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
14700 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
14710 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
14720 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
14730 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14740 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
14750 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
14760 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
14770 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
14780 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
14790 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
147a0 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
147b0 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
147c0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
147d0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
147e0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
147f0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
14800 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
14810 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
14820 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
14830 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
14840 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
14850 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
14860 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
14870 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
14880 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
14890 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
148a0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
148b0 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
148c0 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
148d0 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
148e0 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
148f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
14900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14910 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
14920 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
14930 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14940 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
14950 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
14960 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
14970 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
14980 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
14990 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
149a0 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
149b0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
149c0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
149d0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
149e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
149f0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
14a00 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
14a10 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
14a20 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
14a30 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14a40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
14a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
14a60 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
14a70 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
14a80 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
14a90 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
14aa0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
14ab0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
14ac0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
14ad0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
14ae0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14af0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14b00 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
14b10 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14b20 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
14b30 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
14b40 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
14b50 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
14b60 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
14b70 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
14b80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
14b90 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
14ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
14bb0 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
14bc0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
14bd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14be0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
14bf0 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
14c00 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
14c10 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
14c20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
14c30 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
14c40 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
14c50 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
14c60 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
14c70 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
14c80 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
14c90 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
14ca0 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
14cb0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
14cc0 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
14cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14ce0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
14cf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14d00 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
14d10 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
14d20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14d30 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
14d40 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
14d50 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
14d60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
14d70 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
14d80 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
14d90 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
14da0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
14db0 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
14dc0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
14dd0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
14de0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
14df0 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
14e00 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
14e10 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
14e20 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
14e30 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
14e40 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
14e50 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
14e60 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
14e70 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
14e80 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
14e90 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61  ;..  pBt->initia
14ea0 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28  llyEmpty = (u8)(
14eb0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a  pBt->nPage==0);.
14ec0 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
14ed0 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
14ee0 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
14ef0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
14f00 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
14f10 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
14f20 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
14f30 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
14f40 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
14f50 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
14f60 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
14f70 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
14f80 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
14f90 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
14fa0 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
14fb0 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
14fc0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
14fd0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
14fe0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
14ff0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
15000 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
15010 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
15020 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
15030 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
15040 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
15050 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
15060 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
15070 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
15080 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
15090 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
150a0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
150b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
150c0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
150d0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
150e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
150f0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15110 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15120 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
15130 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
15140 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
15150 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
15160 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15180 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
15190 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
151a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
151b0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
151c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
151d0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
151e0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
151f0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
15200 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
15210 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
15220 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15230 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
15240 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
15250 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
15260 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
15270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15280 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15290 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
152a0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
152b0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
152c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
152d0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
152e0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
152f0 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d  e ){..assert( p-
15300 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
15310 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
15320 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
15330 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
15340 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
15350 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
15360 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
15370 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
15380 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
15390 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
153a0 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
153b0 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
153c0 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
153d0 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
153e0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
153f0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
15400 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
15410 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
15420 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
15430 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
15440 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
15450 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
15460 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15470 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
15480 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
15490 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
154a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
154b0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
154c0 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
154d0 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31   = (u8)(wrflag>1
154e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
154f0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
15500 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
15510 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
15520 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
15530 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
15540 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
15550 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
15560 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
15570 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
15580 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
15590 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
155a0 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
155b0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
155c0 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
155d0 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
155e0 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
155f0 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
15600 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
15610 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
15620 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
15630 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
15640 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
15650 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
15660 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
15670 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
15680 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
15690 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
156a0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
156b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
156c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
156d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
156e0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
156f0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
15700 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
15710 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15720 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
15730 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
15740 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
15750 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
15760 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
15770 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
15780 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
15790 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
157a0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
157b0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
157c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
157d0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
157e0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
157f0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
15800 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
15810 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
15820 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
15830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15840 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
15850 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
15860 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
15870 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
15880 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
15890 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
158a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
158b0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
158c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
158d0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
158e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
158f0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
15900 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
15910 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
15920 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
15930 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
15940 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
15950 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
15960 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
15970 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
15980 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
15990 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
159a0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
159b0 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
159c0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
159f0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
15a00 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15a30 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
15a40 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
15a50 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a70 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
15a80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15a90 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
15aa0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
15ab0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
15ac0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
15ad0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
15ae0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15af0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
15b00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15b10 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
15b20 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
15b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15b40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
15b50 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
15b60 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
15b70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
15b80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
15b90 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
15ba0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
15bb0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
15bc0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
15bd0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
15be0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
15bf0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
15c00 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
15c10 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
15c20 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
15c30 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
15c40 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
15c50 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
15c60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15c70 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
15c80 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
15c90 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
15ca0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
15cb0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
15cc0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
15cd0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
15ce0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
15cf0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
15d00 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
15d10 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
15d20 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
15d30 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
15d40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
15d50 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
15d60 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
15d70 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
15d80 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
15d90 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
15da0 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
15db0 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
15dc0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
15dd0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
15de0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
15df0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
15e00 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
15e10 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
15e20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
15e30 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
15e40 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
15e70 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
15e80 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
15e90 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
15ea0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
15eb0 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
15ec0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15ed0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
15ee0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
15ef0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
15f00 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
15f10 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
15f20 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
15f30 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
15f40 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
15f50 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
15f60 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
15f70 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
15f80 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
15f90 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
15fa0 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
15fb0 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
15fc0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
15fd0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
15fe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15ff0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
16000 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
16010 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
16020 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
16030 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
16040 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
16050 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
16060 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
16070 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
16080 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16090 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
160a0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
160b0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
160c0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
160d0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
160e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
160f0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
16100 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
16110 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
16120 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
16130 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
16140 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
16150 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
16160 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
16170 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
16180 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
16190 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
161a0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
161b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
161c0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
161d0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
161e0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
161f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
16200 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
16210 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
16220 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
16230 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
16240 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
16250 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
16260 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ow.         && p
16270 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
16280 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44  low+3<=pPage->aD
16290 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
162a0 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  age.         && 
162b0 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
162c0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
162d0 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20  rflow]).        
162e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
162f0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
16300 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
16310 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
16320 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
16330 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16340 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
16350 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
16360 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
16370 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
16380 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16390 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
163a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
163b0 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
163c0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
163d0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
163e0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
163f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
16400 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
16410 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
16420 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16430 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16440 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
16450 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
16460 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
16470 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
16480 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
16490 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
164a0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
164b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
164c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
164d0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
164e0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
164f0 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
16500 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
16510 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
16520 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
16530 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
16540 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
16550 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
16560 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
16570 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
16580 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
16590 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
165a0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
165b0 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
165c0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
165d0 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
165e0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
165f0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
16600 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
16610 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
16620 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
16630 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
16640 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
16650 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
16660 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
16670 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
16680 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
16690 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
166a0 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
166b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
166c0 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
166d0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
166e0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
166f0 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
16700 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
16710 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
16720 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
16730 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
16740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16750 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
16760 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
16770 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
16780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
16790 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
167a0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
167b0 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
167c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
167d0 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
167e0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
167f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
16800 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
16810 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
16820 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
16830 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
16840 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
16850 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
16860 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16870 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
16880 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
16890 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
168a0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
168b0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
168c0 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
168d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
168e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
168f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
16900 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
16910 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
16920 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
16930 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
16940 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
16950 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
16960 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
16970 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
16980 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
16990 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
169a0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
169b0 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
169c0 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
169d0 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
169e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
169f0 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
16a00 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
16a10 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
16a20 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
16a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16a40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16a50 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
16a60 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
16a70 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
16a80 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
16a90 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
16aa0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
16ab0 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
16ac0 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
16ad0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
16ae0 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
16af0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
16b00 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
16b10 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
16b20 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
16b30 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
16b40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
16b50 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
16b60 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
16b70 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
16b80 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
16b90 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
16ba0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
16bb0 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
16bc0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
16bd0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
16be0 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
16bf0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
16c00 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
16c10 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
16c20 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
16c30 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
16c40 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
16c50 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
16c60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16c70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16c90 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
16ca0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
16cb0 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
16cc0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
16cd0 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
16ce0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
16cf0 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
16d00 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
16d10 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
16d20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16d30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16d40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16d60 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
16d70 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
16d80 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
16d90 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
16da0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
16db0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
16dc0 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
16dd0 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
16de0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
16df0 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
16e00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
16e10 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
16e20 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
16e30 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
16e40 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
16e50 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
16e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16e70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16e80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
16e90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
16ea0 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
16eb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
16ec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16ed0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
16ee0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
16ef0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16f00 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
16f10 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
16f20 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
16f30 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
16f40 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
16f50 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
16f60 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
16f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16f80 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
16f90 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
16fa0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
16fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
16fc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
16fd0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
16fe0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
16ff0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
17000 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
17010 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
17020 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
17030 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
17040 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
17050 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
17060 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
17070 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
17080 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
17090 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
170a0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
170b0 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
170c0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
170d0 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
170e0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
170f0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
17100 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
17110 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
17120 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
17130 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
17140 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
17150 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
17160 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
17170 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
17180 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
17190 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
171a0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
171b0 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
171c0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
171d0 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
171e0 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74   assumes.** that
171f0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
17200 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
17210 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
17220 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72  ntil.** it retur
17230 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
17240 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  r an error, and 
17250 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65  that nFin is the
17260 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  .** number of pa
17270 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ges the database
17280 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61   file will conta
17290 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a  in after this .*
172a0 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d  * process is com
172b0 70 6c 65 74 65 2e 20 20 49 66 20 6e 46 69 6e 20  plete.  If nFin 
172c0 69 73 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  is zero, it is a
172d0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69  ssumed that.** i
172e0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
172f0 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
17300 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f   finite amount o
17310 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68  f times.** which
17320 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17330 65 6d 70 74 79 20 74 68 65 20 66 72 65 65 6c 69  empty the freeli
17340 73 74 2e 20 20 41 20 66 75 6c 6c 20 61 75 74 6f  st.  A full auto
17350 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46  vacuum.** has nF
17360 69 6e 3e 30 2e 20 20 41 20 22 50 52 41 47 4d 41  in>0.  A "PRAGMA
17370 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63   incremental_vac
17380 75 75 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30  uum" has nFin==0
17390 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
173a0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
173b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
173c0 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
173d0 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e  astPg){.  Pgno n
173e0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
173f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17400 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
17410 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
17420 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
17430 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17440 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
17450 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
17460 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
17470 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
17480 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
17490 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
174a0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
174b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
174c0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
174d0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
174e0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
174f0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
17500 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
17510 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
17520 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
17530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17540 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
17550 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
17560 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
17570 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
17580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
175a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
175b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
175c0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
175d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
175e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
175f0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
17600 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17610 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
17620 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
17630 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
17640 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
17650 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
17660 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
17670 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
17680 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
17690 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
176a0 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
176b0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
176c0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
176d0 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
176e0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
176f0 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
17700 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
17710 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
17720 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
17730 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
17740 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
17750 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
17760 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
17770 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
17780 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
17790 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
177a0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
177b0 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
177c0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
177d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
177e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
177f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
17800 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17810 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
17820 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
17830 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
17840 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17850 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
17860 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
17870 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17880 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
17890 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
178a0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
178b0 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
178c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
178d0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
178e0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
178f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17910 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17920 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17930 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
17940 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
17950 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
17960 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
17970 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
17980 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
17990 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
179a0 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
179b0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
179c0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
179d0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46  ther hand, if nF
179e0 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68  in is greater th
179f0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
17a00 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
17a10 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
17a20 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
17a30 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
17a40 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
17a50 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
17a60 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
17a70 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  /.      do {.   
17a80 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
17a90 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
17aa0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
17ab0 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
17ac0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30  ePg, &iFreePg, 0
17ad0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
17ae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
17b00 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
17b10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
17b20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
17b30 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
17b40 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
17b50 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46        }while( nF
17b60 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67  in!=0 && iFreePg
17b70 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
17b80 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
17b90 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
17ba0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17bb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
17bc0 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  astPg->pDbPage);
17bd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
17be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17bf0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
17c00 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
17c10 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
17c20 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46  age, iFreePg, nF
17c30 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  in!=0);.      }.
17c40 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17c50 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
17c60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17c70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17c80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17c90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
17ca0 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
17cb0 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
17cc0 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d   while( iLastPg=
17cd0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17ce0 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
17cf0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
17d00 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tPg) ){.      if
17d10 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
17d20 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
17d30 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
17d40 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72   *pPg;.        r
17d50 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
17d60 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
17d70 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  pPg, 0);.       
17d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17da0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17db0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
17dc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17dd0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
17de0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
17df0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
17e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17e40 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
17e50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17e60 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
17e70 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
17e80 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 20  r, iLastPg);.   
17e90 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c   pBt->nPage = iL
17ea0 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74  astPg;.  }.  ret
17eb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17ec0 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
17ed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
17ee0 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
17ef0 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
17f00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
17f10 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
17f20 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
17f30 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
17f40 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
17f50 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
17f60 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
17f70 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
17f80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
17f90 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
17fa0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
17fb0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
17fc0 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
17fd0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
17fe0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
17ff0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
18000 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
18010 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
18020 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
18030 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
18040 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
18050 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18060 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
18070 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18080 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18090 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
180a0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
180b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
180c0 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
180d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
180e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
180f0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
18100 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
18110 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
18120 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
18130 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
18140 42 74 2c 20 30 2c 20 62 74 72 65 65 50 61 67 65  Bt, 0, btreePage
18150 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 20  count(pBt));.   
18160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
18180 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18190 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
181a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
181b0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
181c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
181d0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
181e0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
181f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18200 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18210 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18220 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
18230 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
18240 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
18250 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
18260 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
18270 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
18280 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
18290 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
182a0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
182b0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
182c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
182d0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
182e0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
182f0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
18300 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
18310 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
18320 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
18330 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
18340 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
18350 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
18360 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
18370 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
18380 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
18390 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
183a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
183b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
183c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
183d0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
183e0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
183f0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
18400 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
18410 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
18420 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18430 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
18440 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
18450 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
18460 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
18470 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
18480 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
18490 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
184a0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
184b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
184c0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
184d0 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
184e0 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
184f0 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
18500 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
18510 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
18520 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
18530 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
18540 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
18550 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
18560 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
18570 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
18580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
18590 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
185a0 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  eed */.    int n
185b0 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a  Entry;        /*
185c0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
185d0 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
185e0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
185f0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
18600 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
18610 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
18620 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
18630 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
18640 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
18650 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
18660 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
18670 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18680 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
18690 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
186a0 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
186b0 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
186c0 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
186d0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
186e0 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
186f0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
18700 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
18710 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
18720 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
18730 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
18740 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
18750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
18760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18770 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
18780 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
18790 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
187a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
187b0 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  .    nEntry = pB
187c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
187d0 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
187e0 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
187f0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
18800 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
18810 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  ntry;.    nFin =
18820 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
18830 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
18840 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
18850 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
18860 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
18870 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
18880 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
18890 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
188a0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
188b0 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
188c0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
188d0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
188e0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
188f0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
18900 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
18910 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18920 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
18930 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
18940 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
18950 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
18960 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
18970 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
18980 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
18990 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
189a0 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
189b0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
189c0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
189d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
189e0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
189f0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
18a00 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
18a10 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
18a20 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
18a30 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
18a40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
18a50 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
18a60 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18a70 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
18a80 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  in);.      sqlit
18a90 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
18aa0 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
18ab0 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
18ac0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
18ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
18b00 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
18b10 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
18b20 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
18b30 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
18b40 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
18b50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18b60 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
18b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18b80 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
18b90 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
18ba0 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
18bb0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
18bc0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
18bd0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
18be0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
18bf0 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
18c00 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
18c10 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18c20 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
18c30 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
18c40 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
18c50 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
18c60 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
18c70 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
18c80 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
18c90 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
18ca0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
18cb0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
18cc0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
18cd0 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
18ce0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
18cf0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
18d00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
18d10 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
18d20 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
18d30 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
18d40 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
18d50 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
18d60 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
18d70 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
18d80 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18d90 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
18da0 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
18db0 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
18dc0 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
18dd0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
18de0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
18df0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
18e00 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
18e10 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
18e20 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
18e30 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
18e40 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
18e50 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
18e60 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
18e70 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
18e80 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
18e90 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
18ea0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
18eb0 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
18ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
18ed0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
18ee0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
18ef0 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
18f00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18f10 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
18f20 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
18f30 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
18f40 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
18f50 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
18f60 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
18f70 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
18f80 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
18f90 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
18fa0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
18fb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18fc0 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
18fd0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
18fe0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
18ff0 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
19000 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
19010 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
19020 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
19030 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
19040 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
19050 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
19060 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
19070 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
19080 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
19090 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
190a0 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
190b0 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
190c0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
190d0 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
190e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
190f0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
19100 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
19110 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
19120 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
19130 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
19140 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
19150 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19160 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
19170 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
19180 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
19190 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
191a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
191b0 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
191c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
191d0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
191e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
191f0 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
19200 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
19210 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19230 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19240 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
19250 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
19270 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
19280 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
19290 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
192a0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
192b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
192c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
192d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
192e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
192f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
19300 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
19310 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
19320 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
19330 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
19340 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
19350 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
19360 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
19370 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
19380 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
19390 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
193a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
193b0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
193c0 28 70 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43  (p) );..  btreeC
193d0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
193e0 42 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  Bt);.  if( p->in
193f0 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
19400 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76   && p->db->activ
19410 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20  eVdbeCnt>1 ){.  
19420 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
19430 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
19440 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
19450 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
19460 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
19470 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
19480 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
19490 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
194a0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
194b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
194c0 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
194d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
194e0 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
194f0 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
19500 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
19510 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
19520 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
19530 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
19540 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
19550 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
19560 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
19570 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
19580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19590 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
195a0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
195b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
195c0 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
195d0 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
195e0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
195f0 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
19600 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
19610 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
19620 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
19630 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
19640 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
19650 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
19660 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
19670 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
19680 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
19690 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
196a0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
196b0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
196c0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
196d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
196e0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
196f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
19700 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
19710 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
19720 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
19730 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
19740 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
19750 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
19760 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
19770 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
19780 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
19790 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
197a0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
197b0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
197c0 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
197d0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
197e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
197f0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
19800 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
19810 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
19820 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
19830 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
19840 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
19850 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
19860 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
19870 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
19880 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
19890 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
198a0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
198b0 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
198c0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
198d0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
198e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
198f0 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
19900 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
19910 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
19920 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
19930 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
19940 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
19950 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
19960 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
19970 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
19980 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
19990 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
199a0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
199b0 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
199c0 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
199d0 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
199e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
199f0 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
19a00 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
19a10 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
19a20 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
19a30 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
19a40 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
19a50 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
19a60 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
19a70 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
19a80 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
19a90 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
19aa0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
19ab0 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
19ac0 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
19ad0 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
19ae0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
19af0 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
19b00 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
19b10 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
19b20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
19b30 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
19b40 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
19b50 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
19b60 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
19b70 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
19b80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19b90 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
19ba0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
19bb0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19bc0 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
19bd0 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
19be0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
19bf0 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
19c00 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
19c10 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
19c20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
19c30 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
19c40 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
19c50 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
19c60 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
19c70 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
19c80 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
19c90 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
19ca0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
19cb0 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
19cc0 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
19cd0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
19ce0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
19cf0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
19d00 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
19d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
19d20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
19d30 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
19d40 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
19d50 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
19d60 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
19d70 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
19d80 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
19d90 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
19da0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
19db0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
19dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19dd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19de0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
19df0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
19e00 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
19e10 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
19e20 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
19e30 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
19e40 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
19e50 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
19e60 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
19e70 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
19e80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
19e90 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
19ea0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
19eb0 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
19ec0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19ed0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
19ee0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
19ef0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
19f00 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
19f10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
19f20 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19f30 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
19f40 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
19f50 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
19f60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
19f70 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
19f80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19f90 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
19fa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
19fb0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
19fc0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
19fd0 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
19fe0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
19ff0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1a000 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1a010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a020 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1a030 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1a040 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1a050 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1a060 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1a070 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1a080 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1a090 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1a0a0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1a0b0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1a0c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a0d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1a0e0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1a0f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1a100 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a110 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a120 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1a130 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a140 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
1a150 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
1a160 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
1a170 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1a180 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1a190 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1a1a0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1a1b0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1a1c0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1a1d0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1a1e0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1a1f0 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
1a200 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
1a210 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
1a220 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
1a230 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
1a240 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
1a250 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
1a260 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
1a270 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
1a280 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
1a290 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
1a2a0 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
1a2b0 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
1a2c0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
1a2d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1a2e0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1a2f0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1a300 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1a310 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1a320 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1a330 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1a340 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1a350 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1a360 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
1a370 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
1a380 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
1a390 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
1a3a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1a3b0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1a3c0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1a3d0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1a3e0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1a3f0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1a400 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
1a410 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1a420 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1a430 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1a440 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
1a450 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
1a460 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
1a470 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
1a480 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1a490 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
1a4a0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
1a4b0 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
1a4c0 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
1a4d0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1a4e0 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
1a4f0 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
1a500 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
1a510 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
1a520 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
1a530 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
1a540 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
1a550 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
1a560 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
1a570 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
1a580 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
1a590 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
1a5a0 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
1a5b0 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
1a5c0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
1a5d0 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
1a5e0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
1a5f0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1a600 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1a610 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1a620 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1a630 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1a640 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1a650 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
1a660 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
1a670 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1a680 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1a690 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1a6a0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1a6b0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
1a6c0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1a6d0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
1a6e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1a6f0 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
1a700 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
1a710 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1a720 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
1a730 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1a740 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
1a750 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
1a760 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
1a770 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1a780 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1a790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1a7a0 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
1a7b0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
1a7c0 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
1a7d0 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
1a7e0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
1a7f0 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
1a800 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
1a810 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
1a820 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
1a830 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
1a840 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
1a850 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
1a860 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
1a870 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1a880 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1a890 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a8a0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1a8b0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1a8c0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1a8d0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1a8e0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1a8f0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
1a900 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1a910 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1a920 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1a930 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1a940 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1a950 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1a960 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1a970 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
1a980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a990 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1a9a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a9b0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
1a9c0 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
1a9d0 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
1a9e0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1a9f0 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  r occurred whils
1aa00 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
1aa10 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
1aa20 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
1aa30 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
1aa40 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
1aa50 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
1aa60 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
1aa70 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
1aa80 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
1aa90 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
1aaa0 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
1aab0 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
1aac0 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
1aad0 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
1aae0 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
1aaf0 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
1ab00 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
1ab10 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
1ab20 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
1ab30 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
1ab40 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
1ab50 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
1ab60 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
1ab70 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
1ab80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
1ab90 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
1aba0 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   rc);.  }.#endif
1abb0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1abc0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
1abd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1abe0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1abf0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
1ac00 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
1ac10 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ac20 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
1ac30 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1ac40 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
1ac50 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
1ac60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ac70 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1ac80 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
1ac90 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1aca0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
1acb0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
1acc0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
1acd0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
1ace0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
1acf0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
1ad00 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
1ad10 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
1ad20 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
1ad30 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1ad40 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1ad50 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1ad60 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
1ad70 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
1ad80 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
1ad90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ada0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
1adb0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
1adc0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
1add0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1ade0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1adf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ae00 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
1ae10 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
1ae20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1ae30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1ae40 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
1ae50 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
1ae60 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
1ae70 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
1ae80 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1ae90 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1aea0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
1aeb0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
1aec0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1aed0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1aee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
1aef0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
1af00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1af10 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1af20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  can can be rolle
1af30 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
1af40 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
1af50 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
1af60 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
1af70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
1af80 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
1af90 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
1afa0 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
1afb0 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
1afc0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
1afd0 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
1afe0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
1aff0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
1b000 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
1b010 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
1b020 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
1b030 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
1b040 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
1b050 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
1b060 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
1b070 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
1b080 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
1b090 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
1b0a0 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
1b0b0 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
1b0c0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
1b0d0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
1b0e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
1b0f0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1b100 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
1b110 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
1b120 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
1b130 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
1b140 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1b150 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
1b160 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
1b170 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
1b180 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
1b190 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1b1a0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1b1b0 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
1b1c0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
1b1d0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1b1e0 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
1b1f0 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
1b200 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1b210 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
1b220 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
1b230 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
1b240 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
1b250 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
1b260 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
1b270 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
1b280 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
1b290 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
1b2a0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
1b2b0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
1b2c0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1b2d0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1b2e0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
1b2f0 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
1b300 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1b310 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1b320 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
1b330 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1b340 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1b350 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1b360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1b370 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
1b380 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1b390 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1b3a0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
1b3b0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1b3c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1b3d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b3e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1b3f0 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
1b400 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
1b410 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1b420 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
1b430 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
1b440 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
1b450 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
1b460 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
1b470 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
1b480 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
1b490 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
1b4a0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
1b4b0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
1b4c0 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
1b4d0 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
1b4e0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1b4f0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
1b500 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
1b510 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1b520 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1b530 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
1b540 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
1b550 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b560 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b570 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1b580 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1b590 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
1b5a0 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
1b5b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
1b5c0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
1b5d0 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
1b5e0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
1b5f0 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
1b600 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
1b610 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
1b620 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
1b630 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
1b640 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
1b650 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
1b660 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
1b670 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
1b680 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1b690 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
1b6a0 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
1b6b0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
1b6c0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
1b6d0 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
1b6e0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1b6f0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1b700 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1b710 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
1b720 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
1b730 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
1b740 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
1b750 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
1b760 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
1b770 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
1b780 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1b790 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
1b7a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b7b0 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
1b7c0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1b7d0 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1b7e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b7f0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
1b800 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1b810 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1b820 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1b830 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1b840 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
1b850 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
1b860 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1b870 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1b880 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
1b890 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
1b8a0 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
1b8b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
1b8c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b8d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
1b8e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1b8f0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1b900 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
1b910 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1b920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b930 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
1b940 6f 69 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69  oint<0 && pBt->i
1b950 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20  nitiallyEmpty ) 
1b960 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
1b970 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1b980 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1b990 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1b9a0 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1b9b0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1b9c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
1b9d0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1b9e0 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
1b9f0 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
1ba00 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
1ba10 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
1ba20 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1ba30 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
1ba40 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
1ba50 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
1ba60 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
1ba70 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1ba80 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
1ba90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1baa0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1bab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1bac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1bad0 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
1bae0 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
1baf0 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
1bb00 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
1bb10 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
1bb20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1bb30 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1bb40 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1bb50 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1bb60 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1bb70 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1bb80 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1bb90 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1bba0 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1bbb0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1bbc0 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1bbd0 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1bbe0 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1bbf0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1bc00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1bc10 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1bc20 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1bc30 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1bc40 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1bc50 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1bc60 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1bc70 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1bc80 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1bc90 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1bca0 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1bcb0 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1bcc0 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1bcd0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1bce0 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1bcf0 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1bd00 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1bd10 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1bd20 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1bd30 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1bd40 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1bd50 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1bd60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1bd70 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1bd80 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1bd90 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1bda0 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1bdb0 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1bdc0 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1bdd0 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1bde0 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1bdf0 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1be00 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1be10 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1be20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1be30 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1be40 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1be50 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1be60 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1be70 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1be80 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1be90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1bea0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1beb0 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1bec0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1bed0 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1bee0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1bef0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1bf00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1bf10 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1bf20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1bf30 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1bf40 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1bf50 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1bf60 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1bf70 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1bf80 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1bf90 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1bfa0 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1bfb0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1bfc0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1bfd0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
1bfe0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
1bff0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
1c000 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
1c010 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
1c020 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1c030 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
1c040 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
1c050 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c080 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1c090 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0b0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1c0c0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1c0d0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1c0e0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c100 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1c110 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1c120 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1c130 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1c140 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1c150 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
1c160 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
1c170 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1c1a0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
1c1b0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
1c1c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c1e0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
1c1f0 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
1c200 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c210 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c220 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1c230 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
1c240 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
1c250 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
1c260 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
1c270 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
1c280 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
1c290 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
1c2a0 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
1c2b0 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
1c2c0 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
1c2d0 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
1c2e0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
1c2f0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
1c300 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
1c310 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
1c320 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
1c330 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
1c340 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1c350 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1c360 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
1c370 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
1c380 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1c390 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
1c3a0 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
1c3b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
1c3c0 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
1c3d0 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
1c3e0 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
1c3f0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
1c400 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
1c410 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
1c420 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1c430 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
1c440 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1c450 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1c460 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
1c470 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
1c480 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
1c490 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e  g && pBt->readOn
1c4a0 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ly) ){.    retur
1c4b0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
1c4c0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  Y;.  }.  if( iTa
1c4d0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
1c4e0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1c4f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c500 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
1c510 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
1c520 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1c530 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1c540 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1c550 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1c560 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1c570 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1c580 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1c590 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1c5a0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1c5b0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1c5c0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1c5d0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1c5e0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1c5f0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1c600 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1c610 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1c620 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
1c630 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
1c640 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
1c650 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
1c660 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1c670 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
1c680 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
1c690 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
1c6a0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
1c6b0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1c6c0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
1c6d0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1c6e0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1c6f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1c700 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1c710 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1c750 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1c790 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1c7a0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c7d0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1c7e0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1c7f0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1c800 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1c810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c820 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1c830 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1c840 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1c870 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1c880 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1c890 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1c8a0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1c8b0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1c8c0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1c8d0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1c8e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c8f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1c900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1c910 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1c920 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1c930 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1c940 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1c950 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1c960 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1c970 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1c980 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1c990 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1c9a0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1c9b0 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1c9c0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1c9d0 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1c9e0 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1c9f0 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1ca00 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1ca10 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1ca20 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1ca30 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1ca40 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1ca50 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
1ca60 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
1ca70 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1ca80 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1ca90 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1caa0 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
1cab0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
1cac0 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
1cad0 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
1cae0 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
1caf0 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
1cb00 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
1cb10 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
1cb20 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
1cb30 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
1cb40 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
1cb50 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
1cb60 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
1cb70 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
1cb80 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
1cb90 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
1cba0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1cbb0 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
1cbc0 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
1cbd0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1cbe0 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
1cbf0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1cc00 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
1cc10 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
1cc20 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61  /*.** Set the ca
1cc30 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65  ched rowid value
1cc40 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72   of every cursor
1cc50 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
1cc60 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73  abase file.** as
1cc70 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67   pCur and having
1cc80 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70   the same root p
1cc90 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43  age number as pC
1cca0 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ur.  The value i
1ccb0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77  s.** set to iRow
1ccc0 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70  id..**.** Only p
1ccd0 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61  ositive rowid va
1cce0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1ccf0 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68  red valid for th
1cd00 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65  is cache..** The
1cd10 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61   cache is initia
1cd20 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69  lized to zero, i
1cd30 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76  ndicating an inv
1cd40 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41  alid cache..** A
1cd50 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b   btree will work
1cd60 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20   fine with zero 
1cd70 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1cd80 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e  ds.  We just can
1cd90 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72  not.** cache zer
1cda0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
1cdb0 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e  wids, which mean
1cdc0 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73  s tables that us
1cdd0 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67  e zero or.** neg
1cde0 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67  ative rowids mig
1cdf0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
1ce00 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20  slower.  But in 
1ce10 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a  practice, zero.*
1ce20 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  * or negative ro
1ce30 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e  wids are very un
1ce40 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73  common so this s
1ce50 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70  hould not be a p
1ce60 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
1ce70 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
1ce80 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1ce90 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74  sor *pCur, sqlit
1cea0 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29  e3_int64 iRowid)
1ceb0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1cec0 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70  .  for(p=pCur->p
1ced0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1cee0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1cef0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1cf00 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
1cf10 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69   ) p->cachedRowi
1cf20 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  d = iRowid;.  }.
1cf30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1cf40 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f  cachedRowid==iRo
1cf50 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wid );.}../*.** 
1cf60 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65  Return the cache
1cf70 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
1cf80 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41  given cursor.  A
1cf90 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72   negative or zer
1cfa0 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  o.** return valu
1cfb0 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1cfc0 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
1cfd0 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   is invalid and 
1cfe0 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e  should be.** ign
1cff0 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f  ored.  If the ro
1d000 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65  wid cache has ne
1d010 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
1d020 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a  set, then a.** z
1d030 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
1d040 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1d050 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  4 sqlite3BtreeGe
1d060 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
1d070 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d080 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63  return pCur->cac
1d090 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  hedRowid;.}../*.
1d0a0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1d0b0 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
1d0c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d0d0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
1d0e0 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
1d0f0 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
1d100 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
1d110 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
1d120 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
1d130 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
1d140 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
1d150 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
1d160 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
1d170 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1d180 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1d190 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d1a0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1d1b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1d1c0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
1d1d0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1d1e0 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
1d1f0 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
1d200 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
1d210 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d220 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1d230 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1d240 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
1d250 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
1d260 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1d270 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
1d280 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  v;.    }.    for
1d290 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
1d2a0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1d2b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1d2c0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
1d2d0 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
1d2e0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1d2f0 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
1d300 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1d310 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
1d320 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1d330 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1d340 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1d350 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1d360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d370 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1d380 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
1d390 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1d3a0 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
1d3b0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1d3c0 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
1d3d0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1d3e0 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
1d3f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1d400 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
1d410 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
1d420 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
1d430 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
1d440 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1d450 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
1d460 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
1d470 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1d480 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
1d490 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
1d4a0 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
1d4b0 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
1d4c0 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
1d4d0 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
1d4e0 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
1d4f0 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
1d500 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
1d510 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1d520 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
1d530 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
1d540 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
1d550 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
1d560 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
1d570 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
1d580 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
1d590 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
1d5a0 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
1d5b0 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
1d5c0 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
1d5d0 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
1d5e0 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
1d5f0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
1d600 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
1d610 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
1d620 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
1d630 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
1d640 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1d650 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1d660 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
1d670 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1d680 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1d690 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1d6a0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1d6b0 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
1d6c0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
1d6d0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1d6e0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1d6f0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1d700 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1d710 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1d720 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
1d730 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
1d740 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
1d750 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
1d760 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
1d770 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
1d780 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
1d790 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
1d7a0 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
1d7b0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
1d7c0 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
1d7d0 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
1d7e0 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
1d7f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d800 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1d810 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
1d820 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20        int iPage 
1d830 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1d840 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
1d850 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1d860 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1d870 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1d880 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ->info);.      p
1d890 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1d8a0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1d8b0 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49       assertCellI
1d8c0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  nfo(pCur);.    }
1d8d0 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  .  }.#else /* if
1d8e0 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f   not _MSC_VER */
1d8f0 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72  .  /* Use a macr
1d900 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  o in all other c
1d910 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74  ompilers so that
1d920 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
1d930 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66   inlined */.#def
1d940 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ine getCellInfo(
1d950 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20  pCur)           
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d980 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1d990 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1d9a0 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1d9e0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1d9f0 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20  ur->iPage;      
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1da30 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1da40 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1da50 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1da60 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1da70 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75  info); \.    pCu
1da80 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1da90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1dad0 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
1db20 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1db30 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
1db70 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
1db80 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e  ER */..#ifndef N
1db90 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
1dba0 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
1dbb0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1dbc0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1dbd0 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
1dbe0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
1dbf0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
1dc00 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
1dc10 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
1dc20 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
1dc30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
1dc40 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
1dc50 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
1dc60 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
1dc70 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
1dc80 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1dc90 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1dca0 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
1dcb0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1dcc0 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
1dcd0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1dce0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
1dcf0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1dd00 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
1dd10 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
1dd20 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1dd30 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1dd40 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
1dd50 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
1dd60 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
1dd70 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1dd80 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
1dd90 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1dda0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
1ddb0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
1ddc0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
1ddd0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
1dde0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
1ddf0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
1de00 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1de10 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
1de20 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
1de30 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1de40 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
1de50 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
1de60 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
1de70 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1de80 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1de90 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
1dea0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
1deb0 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
1dec0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
1ded0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1dee0 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
1def0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1df00 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1df10 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1df20 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1df30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1df40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1df50 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1df60 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1df70 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
1df80 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1df90 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53  VALID ){.    *pS
1dfa0 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
1dfb0 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66  {.    getCellInf
1dfc0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53  o(pCur);.    *pS
1dfd0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1dfe0 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74  .nKey;.  }.  ret
1dff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e000 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1e010 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1e020 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1e030 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1e040 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1e050 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1e060 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1e070 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
1e080 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
1e090 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1e0a0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
1e0b0 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
1e0c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
1e0d0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1e0e0 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
1e0f0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
1e100 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
1e110 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e120 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
1e130 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
1e140 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
1e150 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
1e160 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1e170 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
1e180 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
1e190 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
1e1a0 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
1e1b0 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
1e1c0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
1e1d0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
1e1e0 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
1e1f0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1e200 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
1e210 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1e220 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
1e230 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e240 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e250 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e260 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e270 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
1e280 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
1e290 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1e2a0 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75  fo.nData;.  retu
1e2b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e2c0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1e2d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e2e0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1e2f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e300 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
1e310 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
1e320 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
1e330 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1e340 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1e350 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
1e360 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
1e370 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
1e380 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
1e390 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
1e3a0 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
1e3b0 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
1e3c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1e3d0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
1e3e0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
1e3f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
1e400 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e410 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1e420 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
1e430 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1e440 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
1e450 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1e460 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
1e470 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
1e480 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
1e490 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
1e4a0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
1e4b0 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
1e4c0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
1e4d0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
1e4e0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
1e4f0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
1e500 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1e510 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
1e520 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1e530 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
1e540 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
1e550 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
1e560 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
1e570 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
1e580 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
1e590 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1e5a0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1e5b0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
1e5c0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
1e5d0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
1e5e0 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
1e5f0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
1e600 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
1e610 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
1e620 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
1e630 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
1e640 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
1e650 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
1e660 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1e670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1e680 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
1e690 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e6b0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
1e6c0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
1e6d0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
1e6e0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1e6f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1e700 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
1e710 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1e720 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1e730 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
1e740 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
1e750 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
1e760 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
1e770 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
1e780 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1e790 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
1e7a0 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
1e7b0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
1e7c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e7d0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
1e7e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e7f0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e800 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
1e810 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
1e820 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e830 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
1e840 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
1e850 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1e860 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
1e870 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
1e880 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
1e890 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
1e8a0 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
1e8b0 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
1e8c0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
1e8d0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
1e8e0 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
1e8f0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
1e900 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
1e910 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
1e920 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
1e930 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
1e940 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
1e950 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
1e960 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
1e970 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1e980 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1e990 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
1e9a0 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
1e9b0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
1e9c0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
1e9d0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
1e9e0 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
1e9f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ea00 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1ea10 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
1ea20 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
1ea30 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
1ea40 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1ea50 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1ea60 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
1ea70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
1ea80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ea90 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
1eaa0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
1eab0 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
1eac0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
1ead0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
1eae0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1eaf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eb00 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1eb10 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
1eb20 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1eb30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1eb40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1eb50 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1eb60 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
1eb70 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1eb80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1eb90 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
1eba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ebb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
1ebc0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
1ebd0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1ebe0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
1ebf0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
1ec00 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
1ec10 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
1ec20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1ec30 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1ec40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ec50 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1ec60 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
1ec70 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
1ec80 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
1ec90 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
1eca0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
1ecb0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
1ecc0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
1ecd0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1ece0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
1ecf0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
1ed00 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1ed10 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
1ed20 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
1ed30 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1ed40 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
1ed50 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
1ed60 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
1ed70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
1ed80 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
1ed90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1eda0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
1edb0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
1edc0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
1edd0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
1ede0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1edf0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
1ee00 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1ee10 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1ee20 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
1ee30 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1ee40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
1ee50 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
1ee60 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
1ee70 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1ee80 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
1ee90 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eeb0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1eec0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
1eed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1eee0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1eef0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
1ef00 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
1ef10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1ef20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
1ef30 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
1ef40 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
1ef50 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
1ef60 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
1ef70 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
1ef80 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
1ef90 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
1efa0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
1efb0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
1efc0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1efd0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1efe0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
1eff0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1f000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1f030 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
1f040 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
1f050 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
1f060 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
1f070 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
1f080 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1f090 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1f0a0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
1f0b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1f0c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f0d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f0e0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1f0f0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
1f100 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1f110 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
1f120 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
1f130 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1f140 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
1f150 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
1f160 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
1f170 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
1f180 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
1f190 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1f1a0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
1f1b0 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
1f1c0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
1f1d0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
1f1e0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
1f1f0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
1f200 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1f210 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
1f220 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
1f230 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
1f240 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1f250 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
1f260 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
1f270 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
1f280 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
1f290 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
1f2a0 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
1f2b0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
1f2c0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
1f2d0 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
1f2e0 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
1f2f0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
1f300 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
1f310 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
1f320 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1f330 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1f340 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1f350 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
1f360 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
1f370 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
1f380 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f390 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
1f3a0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
1f3b0 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
1f3c0 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
1f3d0 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
1f3e0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
1f3f0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
1f400 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
1f410 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
1f420 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1f430 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1f440 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
1f450 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
1f460 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
1f470 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
1f480 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
1f490 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
1f4a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
1f4b0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
1f4c0 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
1f4d0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
1f4e0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
1f4f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
1f500 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
1f510 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f520 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
1f530 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
1f540 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
1f550 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
1f560 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
1f570 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
1f580 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
1f590 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
1f5a0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
1f5b0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
1f5c0 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
1f5d0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1f5e0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1f5f0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1f600 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1f610 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
1f620 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
1f630 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
1f640 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
1f650 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
1f660 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
1f670 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
1f680 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
1f690 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
1f6a0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
1f6b0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
1f6c0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
1f6d0 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
1f6e0 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
1f6f0 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
1f700 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
1f710 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
1f720 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
1f730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f740 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
1f750 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
1f760 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1f770 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f780 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
1f790 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
1f7a0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
1f7b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1f7c0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1f7d0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1f7e0 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
1f7f0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
1f800 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
1f810 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1f820 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f830 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1f840 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f850 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1f860 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
1f870 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f880 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
1f890 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1f8a0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
1f8b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
1f8c0 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
1f8d0 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
1f8e0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
1f8f0 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d  ? 0 : (int)pCur-
1f900 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
1f910 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74  if( NEVER(offset
1f920 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
1f930 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20  ->info.nData) . 
1f940 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70    || &aPayload[p
1f950 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f960 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
1f970 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
1f980 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e].  ){.    /* T
1f990 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
1f9a0 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
1f9b0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
1f9c0 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
1f9d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f9e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f9f0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
1fa00 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
1fa10 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
1fa20 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
1fa30 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
1fa40 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
1fa50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1fa60 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1fa70 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
1fa80 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
1fa90 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
1faa0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1fab0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
1fac0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
1fad0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1fae0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
1faf0 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
1fb00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
1fb10 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
1fb20 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
1fb30 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
1fb40 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
1fb50 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1fb60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1fb70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1fb80 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
1fb90 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
1fba0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1fbb0 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
1fbc0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
1fbd0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
1fbe0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
1fbf0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1fc00 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
1fc10 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
1fc20 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1fc30 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1fc40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
1fc50 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1fc60 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
1fc70 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
1fc80 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
1fc90 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1fca0 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
1fcb0 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
1fcc0 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
1fcd0 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
1fce0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
1fcf0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1fd00 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1fd10 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
1fd20 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
1fd30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1fd40 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
1fd50 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
1fd60 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
1fd70 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
1fd80 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
1fd90 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
1fda0 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
1fdb0 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
1fdc0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
1fdd0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1fde0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1fdf0 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1fe00 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
1fe10 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
1fe20 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
1fe30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
1fe40 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
1fe50 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
1fe60 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
1fe70 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
1fe80 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
1fe90 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
1fea0 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61     /* nOvfl is a
1feb0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
1fec0 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f   If it were zero
1fed0 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77  , fetchPayload w
1fee0 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20  ould have.      
1fef0 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73  ** been used ins
1ff00 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75  tead of this rou
1ff10 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  tine. */.      i
1ff20 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29  f( ALWAYS(nOvfl)
1ff30 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1ff40 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
1ff50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1ff60 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
1ff70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1ff80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1ff90 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1ffa0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
1ffb0 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
1ffc0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
1ffd0 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
1ffe0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
1fff0 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
20000 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
20010 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
20020 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
20030 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
20040 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
20050 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
20060 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
20070 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
20080 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
20090 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
200a0 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
200b0 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
200c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
200d0 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
200e0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
200f0 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
20100 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
20110 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
20120 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
20130 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
20140 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
20150 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
20160 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
20170 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
20180 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
20190 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
201a0 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
201b0 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
201c0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
201d0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
201e0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
201f0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20200 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
20210 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
20220 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
20230 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
20240 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
20250 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
20260 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
20270 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
20280 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
20290 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
202a0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
202b0 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
202c0 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
202d0 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
202e0 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
202f0 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
20300 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
20310 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
20320 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
20330 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
20340 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
20350 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
20360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
20370 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
20380 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20390 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
203a0 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
203b0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
203c0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
203d0 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
203e0 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
203f0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
20400 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
20410 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
20420 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
20430 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
20440 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
20450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20460 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
20470 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
20480 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
20490 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
204a0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
204b0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
204c0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
204d0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
204e0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
204f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
20500 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
20510 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
20520 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
20530 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
20540 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
20550 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
20560 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
20570 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
20580 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
20590 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
205a0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
205b0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
205c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
205d0 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
205e0 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
205f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
20600 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
20610 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
20620 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
20630 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
20640 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
20650 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
20660 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
20670 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
20680 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
20690 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
206a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
206b0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
206c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
206d0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
206e0 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
206f0 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
20700 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
20710 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
20720 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
20730 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
20740 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20750 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
20760 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
20770 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
20780 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
20790 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
207a0 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
207b0 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
207c0 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
207d0 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
207e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
207f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
20800 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20    if( eOp==0    
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
20840 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
20850 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20880 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
20890 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
208a0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
208b0 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
208c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34             /* (4
208d0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
208e0 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
208f0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
20900 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
20910 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
20920 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70         && pBt->p
20930 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d  Page1->aData[19]
20940 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20  ==0x01          
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20960 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (5) */.        )
20970 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
20980 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
20990 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
209a0 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
209b0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
209c0 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
209d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
209e0 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
209f0 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 70 42 74  aWrite, a+4, pBt
20a00 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 6e 65  ->pageSize * (ne
20a10 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
20a20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
20a30 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
20a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
20a50 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
20a60 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
20a70 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
20a80 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
20a90 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
20aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20ab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20ac0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
20ad0 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
20ae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20b00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50  {.            aP
20b10 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
20b20 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
20b30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
20b40 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
20b50 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
20b60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
20b70 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
20b80 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
20b90 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
20ba0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
20bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20bc0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
20bd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
20be0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
20bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20c00 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
20c10 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
20c20 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
20c30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
20c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20c50 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
20c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20c70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
20c80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20c90 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
20ca0 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
20cb0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
20cc0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
20cd0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
20ce0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
20cf0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
20d00 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
20d10 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
20d20 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  "..**.** The cal
20d30 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
20d40 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
20d50 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
20d60 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74   row.** in the t
20d70 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  able..**.** Retu
20d80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
20d90 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
20da0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
20db0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
20dc0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
20dd0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
20de0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
20df0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
20e00 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
20e10 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
20e20 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
20e30 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
20e40 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
20e50 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
20e60 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20e70 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20e80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20e90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
20ea0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
20eb0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
20ec0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
20ed0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
20ee0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20ef0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20f00 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
20f10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
20f20 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
20f30 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
20f40 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
20f50 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
20f60 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
20f70 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
20f80 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
20f90 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
20fa0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
20fb0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
20fc0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
20fd0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
20fe0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
20ff0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
21000 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
21010 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
21020 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
21030 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
21040 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
21050 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
21060 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
21070 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
21080 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
21090 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
210a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
210b0 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
210c0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
210d0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
210e0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
210f0 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
21100 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
21110 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
21120 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21130 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
21140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
21150 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
21160 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21170 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21180 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
21190 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
211a0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
211b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
211c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
211d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
211e0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
211f0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
21200 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
21210 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21220 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21230 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21240 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
21250 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21260 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
21270 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
21280 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
21290 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
212a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
212b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
212c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
212d0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
212e0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
212f0 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
21300 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
21310 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
21320 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
21330 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
21340 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
21350 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
21360 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
21370 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
21380 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
21390 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
213a0 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
213b0 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
213c0 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
213d0 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
213e0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
213f0 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
21400 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
21410 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
21420 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
21430 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
21440 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
21450 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
21460 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
21470 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
21480 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
21490 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
214a0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
214b0 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
214c0 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
214d0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
214e0 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
214f0 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
21500 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
21510 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
21520 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
21530 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
21540 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
21550 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
21560 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
21570 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65  eassemble.** the
21580 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
21590 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
215a0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
215b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
215c0 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
215d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
215e0 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
215f0 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
21600 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
21610 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
21620 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
21630 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
21640 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
21650 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
21660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
21670 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
21680 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
21690 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
216a0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
216b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
216c0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
216d0 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
216e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
216f0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
21700 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
21710 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
21720 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
21730 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
21740 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
21750 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
21760 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21770 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
21780 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
21790 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c  2 nKey;.  u32 nL
217a0 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
217b0 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
217c0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
217d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
217e0 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
217f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
21800 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
21810 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
21820 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21830 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  r) );.  pPage = 
21840 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21850 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
21860 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
21870 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
21880 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
21890 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
218a0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29  info.nSize==0) )
218b0 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
218c0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
218d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20  e[pCur->iPage], 
218e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
218f0 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20  ->iPage],.      
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43               &pC
21910 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20  ur->info);.  }. 
21920 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
21930 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
21940 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
21950 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
21960 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
21970 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
21980 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
21990 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43    nKey = (int)pC
219a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
219b0 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
219c0 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
219d0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
219e0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
219f0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
21a00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
21a10 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
21a20 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73  o.nLocal;.    as
21a30 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b  sert( nLocal<=nK
21a40 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d  ey );.  }.  *pAm
21a50 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  t = nLocal;.  re
21a60 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d  turn aPayload;.}
21a70 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
21a80 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
21a90 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
21aa0 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
21ab0 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
21ac0 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
21ad0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
21ae0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
21af0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
21b00 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
21b10 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
21b20 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
21b30 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
21b40 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
21b50 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
21b60 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
21b70 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
21b80 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
21b90 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
21ba0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
21bb0 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
21bc0 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
21bd0 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
21be0 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
21bf0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
21c00 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
21c10 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
21c20 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
21c30 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
21c40 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
21c50 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
21c60 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
21c70 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
21c80 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
21c90 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
21ca0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
21cb0 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
21cc0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
21cd0 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
21ce0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
21cf0 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
21d00 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  *p = 0;.  assert
21d10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21d20 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
21d30 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
21d40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21d50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21d60 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
21d70 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  S(pCur->eState==
21d80 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b  CURSOR_VALID) ){
21d90 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20  .    p = (const 
21da0 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
21db0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
21dc0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21dd0 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  p;.}.const void 
21de0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
21df0 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
21e00 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
21e10 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
21e20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  *p = 0;.  assert
21e30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21e40 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
21e50 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
21e60 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21e70 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21e80 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
21e90 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  S(pCur->eState==
21ea0 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b  CURSOR_VALID) ){
21eb0 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20  .    p = (const 
21ec0 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
21ed0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31  ad(pCur, pAmt, 1
21ee0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21ef0 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  p;.}.../*.** Mov
21f00 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
21f10 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
21f20 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
21f30 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
21f40 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
21f50 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
21f60 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
21f70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
21f80 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
21f90 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
21fa0 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
21fb0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
21fc0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
21fd0 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
21fe0 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
21ff0 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
22000 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
22010 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
22020 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
22030 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
22040 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
22050 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
22060 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
22070 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
22080 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
22090 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
220a0 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
220b0 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
220c0 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
220d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
220e0 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
220f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22100 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22110 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22120 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22130 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
22140 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
22150 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
22160 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
22170 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
22180 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
22190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
221a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
221b0 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
221c0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
221d0 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
221e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
221f0 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
22200 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
22210 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
22220 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
22230 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
22240 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
22250 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
22260 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
22270 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
22280 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65  ->nCell<1 || pNe
22290 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70  wPage->intKey!=p
222a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
222b0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
222c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
222d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
222e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
222f0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
22300 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
22310 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
22320 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
22330 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
22340 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
22350 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
22360 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
22370 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
22380 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
22390 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
223a0 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
223b0 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
223c0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
223d0 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
223e0 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
223f0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
22400 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
22410 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
22420 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
22430 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
22440 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
22450 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
22460 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
22470 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
22480 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
22490 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
224a0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
224b0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
224c0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
224d0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
224e0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
224f0 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
22500 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
22510 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
22520 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
22530 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
22540 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
22550 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
22560 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
22570 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
22580 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
22590 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
225a0 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
225b0 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
225c0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
225d0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
225e0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
225f0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
22600 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
22610 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
22620 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
22630 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
22640 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
22650 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
22660 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
22670 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
22680 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
22690 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
226a0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
226b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
226c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
226d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
226e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
226f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22700 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
22710 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22720 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22730 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
22740 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
22750 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22760 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
22770 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22780 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
22790 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
227a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
227b0 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61    );.  releasePa
227c0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
227d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
227e0 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
227f0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
22800 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
22810 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d  validNKey = 0;.}
22820 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
22830 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
22840 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
22850 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
22860 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
22870 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
22880 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
22890 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
228a0 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
228b0 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
228c0 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
228d0 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
228e0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
228f0 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
22900 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
22910 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
22920 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
22930 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
22940 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
22950 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
22960 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
22970 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
22980 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
22990 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
229a0 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
229b0 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
229c0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
229d0 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
229e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
229f0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
22a00 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
22a10 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
22a20 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
22a30 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
22a40 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
22a50 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
22a60 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
22a70 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
22a80 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
22a90 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
22aa0 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
22ab0 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
22ac0 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
22ad0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
22ae0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
22af0 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
22b00 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
22b10 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
22b20 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
22b30 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
22b40 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
22b50 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
22b60 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
22b70 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
22b80 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
22b90 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
22ba0 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
22bb0 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
22bc0 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
22bd0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
22be0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
22bf0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
22c00 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
22c10 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
22c20 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
22c30 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
22c40 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
22c50 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
22c60 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
22c70 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
22c80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22c90 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70  E_OK;.  Btree *p
22ca0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
22cb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
22cc0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
22cd0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22ce0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22cf0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
22d00 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
22d10 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
22d20 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
22d30 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
22d40 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
22d50 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
22d60 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
22d70 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
22d80 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
22d90 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
22da0 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
22db0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
22dc0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
22dd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22de0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
22df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
22e00 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
22e10 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d  >skipNext;.    }
22e20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22e30 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
22e40 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
22e50 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
22e60 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
22e70 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
22e80 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
22e90 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22ea0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
22eb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
22ec0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
22ed0 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
22ee0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
22ef0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
22f00 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
22f10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22f20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
22f30 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
22f40 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
22f50 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
22f60 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b  Cur->apPage[0]);
22f70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22f80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22f90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
22fa0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
22fb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22fc0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
22fd0 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  iPage = 0;..    
22fe0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
22ff0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
23000 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
23010 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
23020 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a  is cursor.    **
23030 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
23040 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
23050 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
23060 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
23070 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20  is.    ** NULL, 
23080 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
23090 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
230a0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
230b0 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20  t the case,.    
230c0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
230d0 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
230e0 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  r.  */.    asser
230f0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
23100 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  0]->intKey==1 ||
23110 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
23120 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
23130 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b     if( (pCur->pK
23140 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72  eyInfo==0)!=pCur
23150 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
23160 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
23170 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23180 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
23190 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20   }..  /* Assert 
231a0 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61  that the root pa
231b0 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ge is of the cor
231c0 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20  rect type. This 
231d0 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a  must be the.  **
231e0 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c   case as the cal
231f0 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
23200 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74  on that loaded t
23210 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69  he root-page (ei
23220 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63  ther.  ** this c
23230 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75  all or a previou
23240 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f  s invocation) wo
23250 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
23260 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20  d corruption .  
23270 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70  ** if the assump
23280 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
23290 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  ue, and it is no
232a0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
232b0 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62  he flags .  ** b
232c0 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e  yte to have been
232d0 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20   modified while 
232e0 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68  this cursor is h
232f0 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
23300 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  ce.  ** to the p
23310 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74  age.  */.  pRoot
23320 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
23330 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
23340 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
23350 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61  >pgnoRoot );.  a
23360 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
23370 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70  Init && (pCur->p
23380 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f  KeyInfo==0)==pRo
23390 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ot->intKey );.. 
233a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
233b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
233c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
233d0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
233e0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
233f0 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ey = 0;..  if( p
23400 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
23410 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
23420 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
23430 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
23440 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
23450 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23460 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
23470 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
23480 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
23490 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
234a0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
234b0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
234c0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
234d0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
234e0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
234f0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
23500 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
23510 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
23520 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
23530 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
23540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23550 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
23560 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
23570 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
23580 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
23590 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
235a0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
235b0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
235c0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
235d0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
235e0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
235f0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
23600 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
23610 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
23620 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
23630 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
23640 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
23650 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23660 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
23670 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
23680 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23690 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
236a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
236b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
236c0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
236d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
236e0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
236f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23700 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
23710 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23720 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23730 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
23740 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
23750 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
23760 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
23770 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
23780 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
23790 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
237a0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
237b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
237c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
237d0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
237e0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
237f0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
23800 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
23810 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
23820 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
23830 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
23840 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
23850 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
23860 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
23870 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
23880 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
23890 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
238a0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
238b0 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
238c0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
238d0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
238e0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
238f0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
23900 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
23910 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
23920 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
23930 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
23940 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
23950 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
23960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23970 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
23980 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23990 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
239a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
239b0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
239c0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
239d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
239e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
239f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23a00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23a10 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
23a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23a30 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
23a40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23a50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
23a60 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
23a70 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
23a80 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
23a90 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
23aa0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23ab0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
23ac0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
23ad0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
23ae0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
23af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23b00 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
23b10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
23b20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
23b30 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
23b40 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
23b50 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
23b60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
23b70 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
23b80 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
23b90 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
23ba0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
23bb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
23bc0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
23bd0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
23be0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
23bf0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
23c00 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
23c10 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
23c20 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
23c30 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
23c40 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
23c50 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
23c60 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
23c70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
23c80 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23c90 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23ca0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23cb0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
23cc0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
23cd0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
23ce0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
23cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23d00 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
23d10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
23d20 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
23d30 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
23d40 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
23d50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23d60 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
23d70 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
23d80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
23d90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23da0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23db0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
23dc0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
23dd0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
23de0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
23df0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
23e00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23e10 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23e20 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
23e30 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
23e40 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
23e50 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
23e60 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
23e70 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
23e80 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
23e90 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
23ea0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
23eb0 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
23ec0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
23ed0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
23ee0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23ef0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
23f00 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
23f10 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23f20 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23f30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
23f40 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
23f50 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
23f60 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
23f70 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
23f80 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
23f90 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
23fa0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
23fb0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
23fc0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
23fd0 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74   && pCur->atLast
23fe0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
23ff0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
24000 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
24010 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
24020 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
24030 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
24040 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
24050 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
24060 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
24070 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
24080 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
24090 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
240a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
240b0 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
240c0 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
240d0 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
240e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
240f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24100 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
24110 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24120 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
24130 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
24140 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
24150 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
24160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24170 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
24180 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
24190 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
241a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
241b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
241c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
241d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
241e0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
241f0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
24200 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
24210 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
24220 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
24230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
24240 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24250 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24260 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
24270 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
24280 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
24290 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72  Cur);.      pCur
242a0 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53  ->atLast = rc==S
242b0 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20  QLITE_OK ?1:0;. 
242c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
242d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
242e0 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
242f0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
24300 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
24310 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
24320 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
24330 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
24340 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
24350 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
24360 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
24370 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
24380 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
24390 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
243a0 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
243b0 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
243c0 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
243d0 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
243e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
243f0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
24400 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
24410 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
24420 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
24430 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
24440 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
24450 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
24460 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
24470 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
24480 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
24490 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
244a0 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
244b0 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
244c0 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
244d0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
244e0 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
244f0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
24500 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
24510 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
24520 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
24530 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
24540 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
24550 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
24560 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
24570 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
24580 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
24590 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
245a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
245b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
245c0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
245f0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
24600 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
24610 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
24620 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
24630 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
24640 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
24650 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
24660 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
24670 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
24680 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
24690 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
246a0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
246b0 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
246c0 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
246d0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
246e0 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
246f0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
24700 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
24710 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
24730 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
24740 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
24750 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24760 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
24770 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
24780 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
24790 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
247a0 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
247b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
247c0 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
247d0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
247e0 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
247f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24800 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
24810 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
24820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
24830 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
24840 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
24850 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
24860 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
24870 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
24880 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
24890 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
248a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
248b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
248c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
248d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
248e0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
248f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
24900 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
24910 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
24920 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
24930 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
24940 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
24950 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
24960 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
24970 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
24980 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
24990 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
249a0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
249b0 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
249c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
249d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
249e0 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64  D && pCur->valid
249f0 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72  NKey .   && pCur
24a00 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
24a10 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
24a20 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
24a30 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
24a40 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24a50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24a60 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
24a70 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  if( pCur->atLast
24a80 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
24a90 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
24aa0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
24ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24ac0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
24ad0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
24ae0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
24af0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
24b00 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
24b10 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
24b20 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
24b30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24b40 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
24b50 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
24b60 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
24b70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24b80 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
24b90 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24ba0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
24bb0 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  D || pCur->apPag
24bc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24bd0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28  nCell>0 );.  if(
24be0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24bf0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
24c00 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
24c10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
24c20 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
24c30 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
24c40 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24c50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
24c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24c70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
24c80 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
24c90 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
24ca0 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
24cb0 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
24cc0 69 64 78 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  idx;.    Pgno ch
24cd0 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
24ce0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
24cf0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24d00 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b  age];.    int c;
24d10 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
24d20 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
24d30 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
24d40 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
24d50 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
24d60 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
24d70 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
24d80 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
24d90 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
24da0 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
24db0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
24dc0 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
24dd0 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
24de0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
24df0 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
24e00 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
24e10 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
24e20 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
24e30 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
24e40 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
24e50 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
24e60 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
24e70 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
24e80 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
24e90 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
24ea0 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
24eb0 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
24ec0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
24ed0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
24ee0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
24ef0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
24f00 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
24f10 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
24f20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
24f30 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
24f40 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
24f50 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
24f60 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
24f70 75 31 36 29 28 69 64 78 20 3d 20 75 70 72 29 3b  u16)(idx = upr);
24f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24f90 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
24fa0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
24fb0 36 29 28 69 64 78 20 3d 20 28 75 70 72 2b 6c 77  6)(idx = (upr+lw
24fc0 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
24fd0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
24fe0 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
25010 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
25020 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
25030 20 20 61 73 73 65 72 74 28 20 69 64 78 3d 3d 70    assert( idx==p
25040 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25050 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 20  >iPage] );.     
25060 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25070 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65  e = 0;.      pCe
25080 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
25090 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
250a0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
250b0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
250c0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
250d0 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
250e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
250f0 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
25100 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
25110 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
25120 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
25130 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
25140 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25150 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
25160 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
25170 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
25180 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
25190 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
251a0 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
251b0 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
251c0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
251d0 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
251e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
251f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25200 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
25210 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
25220 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
25230 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61          pCur->va
25240 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
25250 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
25260 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
25270 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
25290 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
252a0 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
252b0 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
252c0 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
252d0 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
252e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
252f0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
25300 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
25310 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
25320 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
25330 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
25340 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
25350 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
25360 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
25370 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
25380 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
25390 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
253a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
253b0 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
253c0 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
253d0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
253e0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
253f0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
25400 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
25410 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
25420 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
25430 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
25440 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
25450 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
25460 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
25470 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
25480 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65         if( !(nCe
25490 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43  ll & 0x80) && nC
254a0 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ell<=pPage->maxL
254b0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
254c0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
254d0 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
254e0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
254f0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
25500 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
25510 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
25520 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
25530 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
25540 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
25550 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
25560 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
25570 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
25580 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
25590 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
255a0 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
255b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
255c0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
255d0 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
255e0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
255f0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
25600 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
25610 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
25620 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
25630 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
25640 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
25650 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
25660 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
25670 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
25680 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
25690 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
256a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
256b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
256c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
256d0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
256e0 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
256f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25700 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
25710 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
25720 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
25730 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
25740 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
25750 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
25760 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
25770 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
25780 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
25790 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
257a0 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
257b0 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
257c0 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
257d0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
257e0 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
257f0 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
25800 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
25810 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
25820 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
25830 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
25840 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
25850 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
25860 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
25870 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
25880 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
25890 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
258a0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
258b0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
258c0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
258d0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
258e0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
258f0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
25900 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25910 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
25920 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25940 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
25950 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
25960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25970 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
25980 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
25990 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
259a0 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
259b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
259c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
259d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
259e0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
259f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
25a00 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
25a10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25a20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
25a30 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
25a40 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
25a50 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
25a60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25a70 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
25a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25a90 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
25aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
25ab0 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
25ac0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25ad0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
25ae0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
25af0 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
25b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25b10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25b20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
25b30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
25b50 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
25b60 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
25b70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
25b80 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
25b90 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
25ba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25bb0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
25bc0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
25bd0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
25be0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
25c00 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25c10 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64  Page] = (u16)(id
25c20 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 29  x = (lwr+upr)/2)
25c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
25c40 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
25c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
25c60 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
25c70 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
25c80 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
25c90 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
25ca0 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
25cb0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
25cc0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
25cd0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
25ce0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
25cf0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
25d00 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
25d10 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
25d20 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
25d30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
25d40 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
25d50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25d60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25d70 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
25d80 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
25d90 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ell );.      *pR
25da0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
25db0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25dc0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
25dd0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
25de0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
25df0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
25e00 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
25e10 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
25e20 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
25e30 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
25e40 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
25e50 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
25e60 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
25e70 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
25e80 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
25e90 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
25ea0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
25eb0 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
25ec0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
25ed0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
25ee0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
25ef0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
25f00 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
25f10 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
25f20 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
25f30 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
25f40 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
25f50 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
25f60 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
25f70 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
25f80 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
25f90 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
25fa0 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
25fb0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
25fc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
25fd0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25fe0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
25ff0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
26000 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
26010 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
26020 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
26030 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
26040 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
26050 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
26060 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
26070 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
26080 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
26090 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
260a0 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
260b0 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
260c0 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
260d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
260e0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
260f0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
26100 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
26110 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
26120 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
26130 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
26140 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
26150 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
26160 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
26170 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
26180 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
26190 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
261a0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
261b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
261c0 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
261d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
261e0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
261f0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
26200 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
26210 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26220 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26230 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
26240 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
26250 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
26260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26270 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
26280 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
26290 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  0 );.  if( CURSO
262a0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
262b0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
262c0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
262d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
262e0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
262f0 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
26300 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
26310 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
26320 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
26330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
26340 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
26350 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
26360 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26370 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
26380 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
26390 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
263a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
263b0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
263c0 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e  rt( idx<=pPage->
263d0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
263e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
263f0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
26400 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  Key = 0;.  if( i
26410 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
26420 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
26430 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
26440 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
26450 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
26460 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
26470 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
26480 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
26490 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
264a0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
264b0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
264c0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
264d0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
264e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
264f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
26500 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
26510 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
26520 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
26530 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
26540 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
26550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26570 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
26580 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
26590 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
265a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
265b0 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
265c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
265d0 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
265e0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
265f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
26600 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
26610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
26620 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
26630 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
26640 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26650 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
26660 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
26670 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
26680 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
26690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
266a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
266b0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
266c0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
266d0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
266e0 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
266f0 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
26700 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
26710 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
26720 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
26730 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
26740 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
26750 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
26760 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
26770 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
26780 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
26790 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
267a0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
267b0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
267c0 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
267d0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
267e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
267f0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
26800 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
26810 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
26820 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26830 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
26840 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
26850 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
26860 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
26870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
26880 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
26890 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
268a0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
268b0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
268c0 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
268d0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
268e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
268f0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
26900 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  xt<0 ){.    pCur
26910 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
26920 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
26930 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26940 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
26950 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a  >skipNext = 0;..
26960 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
26970 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26980 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
26990 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
269a0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
269b0 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
269c0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
269d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
269e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
269f0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
26a00 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
26a10 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
26a20 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
26a30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
26a40 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
26a50 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
26a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
26a70 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
26a80 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
26a90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
26aa0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
26ab0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
26ac0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
26ad0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
26ae0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
26af0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26b10 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
26b20 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  r);.    }.    pC
26b30 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
26b40 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
26b50 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
26b60 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
26b70 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
26b80 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
26b90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26ba0 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ge];.    if( pPa
26bb0 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
26bc0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
26bd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26be0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
26bf0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
26c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
26c10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26c20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
26c30 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
26c40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
26c50 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
26c60 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
26c70 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
26c80 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
26c90 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
26ca0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
26cb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26cc0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
26cd0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
26ce0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
26cf0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
26d00 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
26d10 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
26d20 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
26d30 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
26d40 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
26d50 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
26d60 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
26d70 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
26d80 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
26d90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
26da0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
26db0 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
26dc0 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
26dd0 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
26de0 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
26df0 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
26e00 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
26e10 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
26e20 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
26e30 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
26e40 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
26e50 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
26e60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
26e70 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
26e80 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
26e90 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
26ea0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
26eb0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
26ec0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
26ed0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
26ee0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
26ef0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
26f00 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
26f10 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
26f20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
26f30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26f40 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
26f50 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
26f60 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
26f70 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
26f80 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
26f90 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
26fa0 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
26fb0 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
26fc0 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
26fd0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
26fe0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
26ff0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
27000 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
27010 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
27020 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
27030 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
27040 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
27050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
27060 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
27070 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
27080 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
27090 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
270a0 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
270b0 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
270c0 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
270d0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
270e0 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
270f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
27100 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
27110 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
27120 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27130 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
27140 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
27150 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
27160 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
27170 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
27180 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
27190 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
271a0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
271b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
271c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
271d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
271e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
271f0 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
27200 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
27210 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
27220 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74  (pBt);.  n = get
27230 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27240 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
27250 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
27260 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
27270 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
27280 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27290 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
272a0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
272b0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
272c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
272d0 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
272e0 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
272f0 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
27300 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
27310 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
27320 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
27330 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
27340 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
27350 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
27360 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
27370 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
27380 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
27390 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
273a0 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
273b0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
273c0 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
273d0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
273e0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
273f0 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
27400 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
27410 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
27420 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27430 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
27440 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20     if( exact && 
27450 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
27460 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
27470 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27480 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
27490 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
274a0 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
274b0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
274c0 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
274d0 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
274e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
274f0 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
27500 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
27510 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
27520 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
27530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
27540 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
27550 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
27560 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
27570 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
27580 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
27590 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
275a0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
275b0 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
275c0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
275d0 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
275e0 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
275f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27600 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
27610 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
27620 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
27630 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
27640 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
27650 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
27660 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
27670 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
27680 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
27690 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
276a0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
276b0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
276c0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
276d0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
276e0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
276f0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
27700 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
27710 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
27720 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
27730 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
27740 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
27750 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
27760 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
27770 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
27780 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
27790 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
277a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
277b0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
277c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
277d0 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
277e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
277f0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
27800 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
27810 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
27820 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
27830 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
27840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27850 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
27860 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
27870 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
27880 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27890 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
278a0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
278b0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
278c0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
278d0 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  }..      k = get
278e0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
278f0 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f  Data[4]); /* # o
27900 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73  f leaves on this
27910 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
27920 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
27930 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
27940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
27950 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
27960 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
27970 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
27980 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
27990 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
279a0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
279b0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
279c0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
279d0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
279e0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
279f0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
27a00 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
27a10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
27a20 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
27a30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
27a40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27a50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27a60 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27a80 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
27a90 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
27aa0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
27ab0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
27ac0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
27ad0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
27ae0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
27af0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
27b00 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
27b10 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
27b20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
27b30 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
27b40 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
27b50 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
27b60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
27b70 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
27b80 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
27b90 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
27ba0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
27bb0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
27bc0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
27bd0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
27be0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
27bf0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
27c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
27c10 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
27c20 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
27c30 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
27c40 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
27c50 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
27c60 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
27c70 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
27c80 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
27c90 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
27ca0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
27cb0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
27cc0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
27cd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
27ce0 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
27cf0 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
27d00 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
27d10 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
27d20 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
27d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27d40 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
27d50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
27d60 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
27d70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
27d80 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
27d90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27da0 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
27db0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
27dc0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
27dd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
27de0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
27df0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
27e00 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
27e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27e20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27e30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
27e40 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
27e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27e80 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
27e90 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
27ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27eb0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
27ec0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
27ed0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
27ee0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
27ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
27f00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
27f10 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
27f20 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
27f30 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
27f40 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
27f50 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
27f60 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
27f70 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
27f80 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
27f90 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
27fa0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
27fb0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
27fc0 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
27fd0 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
27fe0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
27ff0 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
28000 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
28010 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
28020 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d   if( iNewTrunk>m
28030 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20  xPage ){ .      
28040 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28050 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28060 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
28070 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
28080 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
28090 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
280a0 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
280b0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
280c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
280d0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
280e0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
280f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
28100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28120 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
28130 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
28140 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
28150 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28160 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
28170 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
28180 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
281a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
281b0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
281c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
281d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
281e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
281f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
28200 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
28210 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
28220 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
28230 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
28240 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
28250 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
28260 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
28270 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
28280 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
28290 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
282a0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
282b0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
282c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
282d0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
282e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
282f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
28300 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
28310 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
28320 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
28330 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
28340 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
28350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
28360 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
28370 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28380 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
28390 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
283a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
283b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
283c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
283d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
283e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
283f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
28400 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
28410 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
28420 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
28440 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
28450 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
28460 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
28470 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
28480 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
28490 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
284a0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
284b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
284c0 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
284d0 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
284e0 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
284f0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
28500 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
28510 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
28520 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
28530 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
28540 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
28550 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
28560 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
28570 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
28580 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
28590 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
285a0 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
285b0 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
285c0 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
285d0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
285e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
285f0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
28600 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
28610 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
28620 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
28630 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
28640 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
28650 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
28660 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
28670 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
28680 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
286a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
286b0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
286c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
286d0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
286e0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
286f0 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
28700 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
28710 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
28720 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
28730 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
28740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
28750 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
28760 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
28770 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
28780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
28790 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
287a0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
287b0 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
287c0 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72  t || iPage==near
287d0 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
287e0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
287f0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
28800 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
28810 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
28820 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
28830 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
28840 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
28850 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
28860 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
28870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28880 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
28890 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
288a0 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
288b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
288c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
288d0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
288e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
288f0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
28900 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
28910 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
28920 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
28930 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
28940 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
28950 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
28960 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
28970 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
28980 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
28990 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
289a0 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
289b0 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
289c0 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20  t, *pPgno);.    
289d0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
289e0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
289f0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
28a00 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
28a10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28a30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28a40 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
28a50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
28a60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28a70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
28a90 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
28aa0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
28ab0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
28ac0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
28ad0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
28ae0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
28af0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
28b00 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
28b10 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
28b20 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
28b30 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
28b40 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
28b50 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
28b60 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
28b70 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
28b80 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
28b90 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
28ba0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
28bb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28bc0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
28bd0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
28be0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28bf0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
28c00 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
28c10 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
28c20 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
28c30 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
28c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28c50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
28c60 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
28c70 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
28c80 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
28c90 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
28ca0 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
28cb0 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
28cc0 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
28cd0 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
28ce0 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
28cf0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
28d00 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
28d10 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
28d20 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
28d30 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
28d40 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
28d50 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
28d60 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
28d70 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
28d80 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
28d90 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
28da0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
28db0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
28dc0 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
28dd0 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
28de0 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
28df0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
28e00 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
28e10 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
28e20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
28e30 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
28e40 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  e, &pPg, 1);.   
28e50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28e70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28e80 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
28e90 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
28ea0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
28eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28ec0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28ed0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
28ee0 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
28ef0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
28f00 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
28f10 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
28f20 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
28f30 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
28f40 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
28f50 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
28f60 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
28f70 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
28f80 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
28f90 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
28fa0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
28fb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
28fc0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
28fd0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
28fe0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
28ff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
29000 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29010 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
29020 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
29030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29040 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
29050 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
29060 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
29070 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
29080 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
29090 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
290a0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
290b0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
290c0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
290d0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
290e0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
290f0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
29100 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
29110 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
29120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
29130 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
29140 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
29150 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
29160 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
29170 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
29180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
29190 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
291a0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
291b0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
291c0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
291d0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
291e0 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
291f0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
29200 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29210 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  able((*ppPage)->
29220 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
29230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29240 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
29250 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
29260 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
29270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
29280 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
29290 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
292a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
292b0 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
292c0 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
292d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
292e0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
292f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
29300 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
29310 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
29320 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
29330 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
29340 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
29350 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
29360 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
29370 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
29380 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
29390 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
293a0 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
293b0 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
293c0 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
293d0 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
293e0 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
293f0 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
29400 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
29410 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
29420 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
29430 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
29440 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
29450 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
29460 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
29470 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
29480 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
29490 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
294a0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
294b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
294c0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
294d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
294e0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
294f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
29500 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
29510 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
29520 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
29530 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
29540 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
29550 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
29560 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
29570 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29590 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
295a0 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
295b0 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
295e0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
295f0 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
29620 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
29630 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
29640 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29650 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
29660 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
29670 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b  sert( iPage>1 );
29680 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
29690 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
296a0 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
296b0 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ..  if( pMemPage
296c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
296d0 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
296e0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
296f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
29700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
29710 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
29720 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
29730 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
29740 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
29750 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
29760 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
29770 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29780 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
29790 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
297a0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
297b0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
297c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
297d0 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
297e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
297f0 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
29800 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75  .  if( pBt->secu
29810 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
29820 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65  /* If the secure
29830 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69  _delete option i
29840 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
29850 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75      ** always fu
29860 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
29870 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
29880 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
29890 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
298a0 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62  Page && ((rc = b
298b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
298c0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
298d0 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c  0))!=0) ).     |
298e0 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72  |            ((r
298f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29900 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
29910 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29  Page))!=0).    )
29920 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
29930 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
29940 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
29950 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
29960 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
29970 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
29980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
29990 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
299a0 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
299b0 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
299c0 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
299d0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
299e0 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
299f0 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
29a00 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
29a10 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
29a20 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
29a30 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
29a40 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
29a50 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
29a60 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
29a70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
29a80 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
29a90 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
29aa0 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
29ab0 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
29ac0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
29ad0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
29ae0 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
29af0 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
29b00 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
29b10 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
29b20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
29b30 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
29b40 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
29b50 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
29b60 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
29b70 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
29b80 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
29b90 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
29ba0 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
29bb0 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
29bc0 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
29bd0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
29be0 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
29bf0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
29c00 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
29c10 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
29c20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
29c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
29c40 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
29c50 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
29c60 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
29c70 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
29c80 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
29c90 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
29ca0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
29cb0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
29cc0 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
29cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29ce0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
29cf0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
29d00 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
29d10 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
29d20 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
29d30 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
29d40 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
29d50 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
29d60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
29d70 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
29d80 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
29d90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
29da0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29dc0 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
29dd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
29de0 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
29df0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
29e00 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
29e10 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
29e20 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
29e30 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
29e40 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
29e50 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
29e60 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
29e70 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
29e80 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
29e90 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
29ea0 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
29eb0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
29ec0 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
29ed0 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
29ee0 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
29ef0 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
29f00 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
29f10 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
29f20 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
29f30 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
29f40 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
29f50 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
29f60 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
29f70 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
29f80 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
29f90 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
29fa0 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
29fb0 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
29fc0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
29fd0 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
29fe0 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
29ff0 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
2a000 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2a010 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
2a020 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
2a030 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
2a040 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
2a050 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
2a060 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
2a070 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
2a080 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
2a090 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
2a0a0 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
2a0b0 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
2a0c0 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
2a0d0 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
2a0e0 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
2a0f0 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
2a100 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
2a110 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
2a120 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
2a130 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
2a140 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2a150 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a160 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2a170 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2a180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a190 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
2a1a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
2a1b0 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
2a1c0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
2a1d0 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
2a1e0 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
2a1f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
2a200 26 26 20 21 70 42 74 2d 3e 73 65 63 75 72 65 44  && !pBt->secureD
2a210 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
2a220 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
2a230 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
2a240 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2a250 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2a260 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
2a270 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
2a280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
2a290 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2a2a0 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
2a2b0 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
2a2c0 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
2a2d0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2a2e0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2a2f0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2a300 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
2a310 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
2a320 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
2a330 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
2a340 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
2a350 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2a360 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
2a370 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
2a380 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
2a390 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
2a3a0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
2a3b0 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
2a3c0 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
2a3d0 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
2a3e0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
2a3f0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2a400 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
2a410 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
2a420 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
2a430 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
2a440 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
2a450 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
2a460 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
2a470 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
2a480 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
2a490 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2a4a0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2a4b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
2a4c0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2a4d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a4e0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2a4f0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2a500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a510 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2a520 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
2a530 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
2a540 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
2a550 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2a560 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
2a570 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2a580 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
2a590 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
2a5a0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
2a5b0 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
2a5c0 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
2a5d0 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
2a5e0 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
2a5f0 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
2a600 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
2a610 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
2a620 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2a630 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2a640 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
2a650 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
2a660 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
2a670 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
2a680 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
2a690 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
2a6a0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
2a6b0 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
2a6c0 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
2a6d0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
2a6e0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
2a6f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2a700 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2a710 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
2a720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2a730 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
2a740 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
2a750 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
2a760 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a770 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
2a780 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
2a790 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
2a7a0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
2a7b0 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
2a7c0 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
2a7d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a7e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2a7f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62  t->mutex) );.  b
2a800 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2a810 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
2a820 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
2a830 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
2a840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a850 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
2a860 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
2a870 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
2a880 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
2a890 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
2a8a0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
2a8b0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
2a8c0 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
2a8d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a8e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f  LITE_CORRUPT;  /
2a8f0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
2a900 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
2a910 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
2a920 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
2a930 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2a940 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
2a950 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2a960 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
2a970 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2a980 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
2a990 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
2a9a0 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
2a9b0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
2a9c0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
2a9d0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
2a9e0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
2a9f0 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
2aa00 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
2aa10 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
2aa20 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2aa30 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
2aa40 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
2aa50 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
2aa60 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
2aa70 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
2aa80 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
2aa90 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
2aaa0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
2aab0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2aac0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
2aad0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
2aae0 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
2aaf0 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
2ab00 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
2ab10 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2ab20 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
2ab30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ab40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2ab50 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
2ab60 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2ab70 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
2ab80 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
2ab90 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
2aba0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2abb0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2abc0 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
2abd0 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
2abe0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
2abf0 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
2ac00 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2ac10 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
2ac20 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
2ac30 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
2ac40 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
2ac50 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
2ac60 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
2ac70 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2ac80 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
2ac90 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2aca0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
2acb0 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
2acc0 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
2acd0 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
2ace0 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
2acf0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
2ad00 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2ad10 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
2ad20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
2ad30 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
2ad40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
2ad50 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
2ad60 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2ad70 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
2ad80 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
2ad90 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
2ada0 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
2adb0 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
2adc0 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
2add0 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
2ade0 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
2adf0 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
2ae00 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
2ae10 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
2ae20 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
2ae30 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
2ae40 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
2ae50 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
2ae60 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
2ae70 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
2ae80 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
2ae90 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
2aea0 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
2aeb0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2aec0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2aed0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2aee0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2aef0 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
2af00 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
2af10 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
2af20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2af30 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
2af40 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2af50 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
2af60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
2af70 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
2af80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2af90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2afa0 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
2afb0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
2afc0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
2afd0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
2afe0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
2aff0 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
2b000 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
2b010 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
2b020 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
2b030 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
2b040 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
2b050 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
2b060 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
2b070 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2b080 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
2b090 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
2b0a0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
2b0b0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
2b0c0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
2b0d0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
2b0e0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
2b0f0 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
2b100 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
2b110 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
2b120 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
2b130 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
2b140 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
2b150 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
2b160 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
2b170 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
2b180 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
2b190 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
2b1a0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2b1b0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2b1c0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
2b1d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2b1e0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2b1f0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
2b200 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2b210 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
2b220 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
2b230 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
2b240 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2b250 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2b260 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
2b270 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2b280 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
2b290 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
2b2a0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b2c0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
2b2d0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
2b2e0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
2b2f0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2b300 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2b310 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
2b320 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
2b330 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
2b340 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
2b350 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
2b360 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
2b370 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2b380 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
2b390 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
2b3a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2b3b0 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
2b3c0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
2b3d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2b3e0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2b3f0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
2b400 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
2b410 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
2b420 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
2b430 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2b440 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2b450 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
2b460 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
2b470 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
2b480 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
2b490 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
2b4a0 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
2b4b0 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
2b4c0 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
2b4d0 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
2b4e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
2b4f0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2b500 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
2b510 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2b520 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2b530 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2b540 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2b550 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2b560 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2b570 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
2b580 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
2b590 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2b5a0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2b5b0 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
2b5c0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
2b5d0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
2b5e0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
2b5f0 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e  Header], nData+n
2b600 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Zero);.  }else{.
2b610 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72      nData = nZer
2b620 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  o = 0;.  }.  nHe
2b630 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2b640 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
2b650 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
2b660 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2b670 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2b680 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
2b690 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
2b6a0 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
2b6b0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
2b6c0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
2b6d0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
2b6e0 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a  ==(u32)(nData+nZ
2b6f0 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  ero) );.  .  /* 
2b700 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
2b710 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
2b720 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
2b730 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
2b740 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
2b750 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2b760 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2b770 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
2b780 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e  else{ .    if( N
2b790 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66  EVER(nKey>0x7fff
2b7a0 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29  ffff || pKey==0)
2b7b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b7c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b7d0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2b7e0 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
2b7f0 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
2b800 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
2b810 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
2b820 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
2b830 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
2b840 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
2b850 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
2b860 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
2b870 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
2b880 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
2b890 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
2b8a0 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
2b8b0 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
2b8c0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
2b8d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2b8e0 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
2b8f0 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
2b900 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
2b910 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
2b920 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
2b930 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
2b940 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2b950 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
2b960 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
2b970 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
2b980 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
2b990 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
2b9a0 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
2b9b0 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
2b9c0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
2b9d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2b9e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
2b9f0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2ba00 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
2ba10 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
2ba20 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
2ba30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ba40 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2ba50 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2ba60 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
2ba70 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
2ba80 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
2ba90 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
2baa0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
2bab0 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
2bac0 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
2bad0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2bae0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
2baf0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
2bb00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2bb10 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2bb20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
2bb30 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
2bb40 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
2bb50 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2bb60 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
2bb70 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
2bb80 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
2bb90 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
2bba0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
2bbb0 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
2bbc0 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
2bbd0 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
2bbe0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
2bbf0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
2bc00 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
2bc10 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
2bc20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
2bc30 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
2bc40 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
2bc50 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2bc60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2bc70 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2bc80 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2bc90 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
2bca0 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
2bcb0 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
2bcc0 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
2bcd0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2bce0 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
2bcf0 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
2bd00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2bd10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
2bd20 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
2bd30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bd40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
2bd50 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2bd60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2bd70 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
2bd80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bd90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2bda0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2bdb0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2bdc0 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
2bdd0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2bde0 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
2bdf0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2be00 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2be10 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2be20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2be30 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
2be40 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2be50 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
2be60 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
2be70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2be80 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
2be90 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
2bea0 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
2beb0 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
2bec0 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
2bed0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2bee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
2bef0 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
2bf00 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
2bf10 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2bf20 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2bf30 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2bf40 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2bf50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2bf60 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
2bf70 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
2bf80 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
2bf90 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2bfa0 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
2bfb0 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
2bfc0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
2bfd0 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
2bfe0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2bff0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
2c000 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
2c010 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
2c020 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
2c030 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2c040 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
2c050 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
2c060 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
2c070 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
2c080 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
2c090 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
2c0a0 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
2c0b0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2c0c0 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
2c0d0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
2c0e0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
2c0f0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
2c100 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
2c110 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2c120 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2c130 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2c140 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2c150 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
2c160 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
2c170 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2c180 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2c190 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2c1a0 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
2c1b0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2c1c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
2c1d0 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
2c1e0 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
2c1f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2c200 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2c210 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2c220 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2c230 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2c240 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
2c250 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
2c260 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
2c270 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
2c280 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
2c290 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
2c2a0 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
2c2b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2c2c0 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
2c2d0 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
2c2e0 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
2c2f0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
2c300 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
2c310 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
2c320 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
2c330 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
2c340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
2c350 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
2c360 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2c370 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
2c380 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2c390 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
2c3a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2c3b0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
2c3c0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
2c3d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2c3e0 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
2c3f0 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
2c400 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
2c410 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
2c420 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
2c430 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
2c440 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
2c450 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
2c460 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
2c470 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
2c480 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
2c490 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2c4a0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2c4b0 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
2c4c0 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
2c4d0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
2c4e0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
2c4f0 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
2c500 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
2c510 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
2c520 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
2c530 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
2c540 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
2c550 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
2c560 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
2c570 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2c580 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
2c590 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
2c5a0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2c5b0 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
2c5c0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
2c5d0 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b  */.  u8 *endPtr;
2c5e0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
2c5f0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  oop */.  int rc;
2c600 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c610 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
2c620 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
2c630 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
2c640 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
2c650 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
2c660 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
2c670 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2c680 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
2c690 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
2c6a0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
2c6b0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2c6c0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
2c6d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c6e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2c6f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2c700 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c710 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c720 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2c730 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
2c740 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2c750 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
2c760 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
2c770 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
2c780 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
2c790 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2c7a0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
2c7b0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
2c7c0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2c7d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2c7e0 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
2c7f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2c800 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
2c810 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2c820 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
2c830 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
2c840 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2c850 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
2c860 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2c870 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
2c880 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
2c890 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
2c8a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
2c8b0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
2c8c0 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72  rn;.  }.  endPtr
2c8d0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
2c8e0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2c8f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32 5d  Page->nCell - 2]
2c900 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
2c910 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
2c920 74 72 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a  tr)&1)==0 );  /*
2c930 20 70 74 72 20 69 73 20 61 6c 77 61 79 73 20 32   ptr is always 2
2c940 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f  -byte aligned */
2c950 0a 20 20 77 68 69 6c 65 28 20 70 74 72 3c 65 6e  .  while( ptr<en
2c960 64 50 74 72 20 29 7b 0a 20 20 20 20 2a 28 75 31  dPtr ){.    *(u1
2c970 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29  6*)ptr = *(u16*)
2c980 26 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72  &ptr[2];.    ptr
2c990 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 50 61   += 2;.  }.  pPa
2c9a0 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70  ge->nCell--;.  p
2c9b0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2c9c0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
2c9d0 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
2c9e0 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a  ree += 2;.}../*.
2c9f0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
2ca00 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
2ca10 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
2ca20 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
2ca30 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
2ca40 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
2ca50 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
2ca60 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
2ca70 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
2ca80 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
2ca90 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
2caa0 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
2cab0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2cac0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
2cad0 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
2cae0 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
2caf0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
2cb00 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
2cb10 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
2cb20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
2cb30 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
2cb40 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
2cb50 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
2cb60 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
2cb70 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
2cb80 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
2cb90 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
2cba0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
2cbb0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
2cbc0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
2cbd0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
2cbe0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
2cbf0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
2cc00 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
2cc10 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
2cc20 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
2cc30 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
2cc40 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
2cc50 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2cc60 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
2cc70 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
2cc80 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
2cc90 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
2cca0 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
2ccb0 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
2ccc0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
2ccd0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
2cce0 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
2ccf0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
2cd00 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2cd10 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
2cd20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2cd30 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
2cd40 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
2cd50 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
2cd60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2cd70 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
2cd80 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
2cd90 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
2cda0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2cdb0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2cdc0 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
2cdd0 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
2cde0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
2cdf0 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
2ce00 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
2ce10 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
2ce20 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
2ce30 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
2ce40 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
2ce50 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  d,      /* If no
2ce60 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20  n-zero, replace 
2ce70 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69  first 4 bytes wi
2ce80 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f  th this value */
2ce90 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20  .  int *pRC     
2cea0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64       /* Read and
2ceb0 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f   write return co
2cec0 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  de from here */.
2ced0 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30  ){.  int idx = 0
2cee0 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ;      /* Where 
2cef0 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
2cf00 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
2cf10 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
2cf20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2cf30 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2cf40 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
2cf50 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
2cf60 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
2cf70 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
2cf80 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
2cf90 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
2cfa0 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
2cfb0 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
2cfc0 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
2cfd0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  d */.  int cellO
2cfe0 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
2cff0 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
2d000 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2d010 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
2d020 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
2d030 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2d040 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
2d050 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
2d060 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
2d070 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
2d080 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
2d090 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50  [] */.  u8 *endP
2d0a0 74 72 3b 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  tr;       /* End
2d0b0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
2d0c0 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28  .  int nSkip = (
2d0d0 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b  iChild ? 4 : 0);
2d0e0 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2d0f0 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2d100 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
2d110 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
2d120 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
2d130 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2d140 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
2d150 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f  age->pBt) && MX_
2d160 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2d170 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
2d180 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2d190 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
2d1a0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29  (pPage->aOvfl) )
2d1b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2d1c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d1d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2d1e0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
2d1f0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
2d200 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
2d210 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
2d220 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
2d230 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
2d240 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
2d250 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
2d260 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
2d270 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
2d280 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
2d290 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
2d2a0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
2d2b0 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
2d2c0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
2d2d0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
2d2e0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
2d2f0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
2d300 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
2d310 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
2d320 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
2d330 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2d340 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
2d350 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2d360 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2d370 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
2d380 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
2d390 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2d3a0 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
2d3b0 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
2d3c0 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
2d3d0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2d3e0 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
2d3f0 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
2d400 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
2d410 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
2d420 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2d430 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
2d440 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
2d450 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
2d460 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
2d470 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
2d480 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
2d490 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
2d4a0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
2d4b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
2d4c0 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
2d4d0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
2d4e0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
2d4f0 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
2d500 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2d510 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d520 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d530 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2d540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d550 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2d560 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2d570 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2d580 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2d590 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2d5a0 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
2d5b0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2d5c0 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
2d5d0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2d5e0 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
2d5f0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
2d600 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
2d610 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
2d620 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
2d630 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
2d640 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
2d650 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
2d660 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
2d670 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
2d680 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
2d690 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
2d6a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
2d6b0 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
2d6c0 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
2d6d0 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
2d6e0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
2d6f0 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
2d700 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
2d710 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
2d720 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2d730 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
2d740 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
2d750 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
2d760 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
2d770 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
2d780 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
2d790 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
2d7a0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2d7b0 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
2d7c0 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
2d7d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20 3d  .    }.    ptr =
2d7e0 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20   &data[end];.   
2d7f0 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b   endPtr = &data[
2d800 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ins];.    assert
2d810 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  ( (SQLITE_PTR_TO
2d820 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20  _INT(ptr)&1)==0 
2d830 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c  );  /* ptr is al
2d840 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67  ways 2-byte alig
2d850 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ned */.    while
2d860 28 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a  ( ptr>endPtr ){.
2d870 20 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72        *(u16*)ptr
2d880 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d   = *(u16*)&ptr[-
2d890 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d 3d  2];.      ptr -=
2d8a0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75   2;.    }.    pu
2d8b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
2d8c0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
2d8d0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
2d8e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
2d8f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2d900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d910 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2d920 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
2d930 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2d940 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
2d950 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
2d960 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
2d970 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
2d980 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
2d990 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
2d9a0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2d9b0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
2d9c0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
2d9d0 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
2d9e0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
2d9f0 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
2da00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
2da10 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
2da20 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
2da30 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
2da40 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
2da50 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
2da60 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
2da70 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
2da80 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
2da90 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
2daa0 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
2dab0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2dac0 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
2dad0 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
2dae0 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
2daf0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
2db00 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
2db10 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
2db20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
2db30 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
2db40 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
2db50 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
2db60 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
2db70 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
2db80 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2db90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2dba0 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
2dbb0 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
2dbc0 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2dbd0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
2dbe0 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
2dbf0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2dc00 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
2dc10 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
2dc20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2dc30 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2dc40 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
2dc50 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
2dc60 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
2dc70 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2dc80 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
2dc90 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
2dca0 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
2dcb0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
2dcc0 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
2dcd0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
2dce0 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
2dcf0 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
2dd00 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2dd10 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
2dd20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2dd30 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2dd40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2dd50 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
2dd60 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58  & nCell<=(int)MX
2dd70 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2dd80 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
2dd90 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50   (int)MX_CELL(pP
2dda0 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
2ddb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ddc0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ddd0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2dde0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
2ddf0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
2de00 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
2de10 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
2de20 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
2de30 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
2de40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
2de50 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
2de60 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55  data[hdr+5])==nU
2de70 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c  sable );..  pCel
2de80 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61  lptr = &data[pPa
2de90 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
2dea0 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c   nCell*2];.  cel
2deb0 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b  lbody = nUsable;
2dec0 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31  .  for(i=nCell-1
2ded0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
2dee0 20 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a 65    u16 sz = aSize
2def0 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  [i];.    pCellpt
2df00 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c  r -= 2;.    cell
2df10 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20  body -= sz;.    
2df20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
2df30 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  r, cellbody);.  
2df40 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
2df50 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
2df60 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20  [i], sz);.  }.  
2df70 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2df80 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
2df90 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2dfa0 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79  hdr+5], cellbody
2dfb0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2dfc0 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20  e -= (nCell*2 + 
2dfd0 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f  nUsable - cellbo
2dfe0 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  dy);.  pPage->nC
2dff0 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
2e000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
2e010 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
2e020 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
2e030 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
2e040 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
2e050 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
2e060 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2e070 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
2e080 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
2e090 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
2e0a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
2e0b0 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
2e0c0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
2e0d0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
2e0e0 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
2e0f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
2e100 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
2e110 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
2e120 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
2e130 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
2e140 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
2e150 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
2e160 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
2e170 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
2e180 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
2e190 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
2e1a0 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
2e1b0 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
2e1c0 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
2e1d0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
2e1e0 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
2e1f0 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
2e200 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
2e210 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
2e220 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
2e230 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
2e240 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
2e250 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
2e260 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
2e270 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
2e280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e290 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2e2a0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
2e2b0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
2e2c0 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
2e2d0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
2e2e0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
2e2f0 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  ance */...#ifnde
2e300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
2e310 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
2e320 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
2e330 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
2e340 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
2e350 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2e360 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
2e370 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
2e380 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
2e390 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
2e3a0 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
2e3b0 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
2e3c0 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
2e3d0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
2e3e0 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
2e3f0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
2e400 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
2e410 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74  ing to balance t
2e420 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
2e430 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
2e440 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
2e450 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
2e460 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
2e470 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
2e480 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
2e490 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
2e4a0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
2e4b0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
2e4c0 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
2e4d0 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
2e4e0 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
2e4f0 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
2e500 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
2e510 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
2e520 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
2e530 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
2e540 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
2e550 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
2e560 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
2e570 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
2e580 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
2e590 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
2e5a0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
2e5b0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
2e5c0 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
2e5d0 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
2e5e0 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
2e5f0 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
2e600 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2e610 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
2e620 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70  e..**.** The pSp
2e630 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73  ace buffer is us
2e640 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65  ed to store a te
2e650 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20  mporary copy of 
2e660 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63  the divider.** c
2e670 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
2e680 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70   inserted into p
2e690 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63  Parent. Such a c
2e6a0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
2e6b0 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65  a 4.** byte page
2e6c0 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64   number followed
2e6d0 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c   by a variable l
2e6e0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49  ength integer. I
2e6f0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
2e700 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74  , at most 13 byt
2e710 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53  es. Hence the pS
2e720 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74  pace buffer must
2e730 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20   be at.** least 
2e740 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
2e750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e760 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
2e770 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2e780 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2e790 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42  u8 *pSpace){.  B
2e7a0 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70  tShared *const p
2e7b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2e7c0 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61      /* B-Tree Da
2e7d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50  tabase */.  MemP
2e7e0 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  age *pNew;      
2e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e800 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
2e810 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ted page */.  in
2e820 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e840 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2e850 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2e860 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2e870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2e880 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e  age number of pN
2e890 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ew */..  assert(
2e8a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2e8b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2e8c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2e8d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2e8e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2e8f0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2e900 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2e910 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
2e920 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72  ;..  /* This err
2e930 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  or condition is 
2e940 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72  now caught prior
2e950 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69   to reaching thi
2e960 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
2e970 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
2e980 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  <=0 ) return SQL
2e990 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2e9a0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2e9b0 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69   a new page. Thi
2e9c0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
2e9d0 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62  me the right-sib
2e9e0 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50  ling of .  ** pP
2e9f0 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  age. Make the pa
2ea00 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62  rent page writab
2ea10 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20  le, so that the 
2ea20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
2ea30 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73  .  ** may be ins
2ea40 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74  erted. If both t
2ea50 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  hese operations 
2ea60 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20  are successful, 
2ea70 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
2ea80 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2ea90 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
2eaa0 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
2eab0 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  0);..  if( rc==S
2eac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
2ead0 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70   u8 *pOut = &pSp
2eae0 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a  ace[4];.    u8 *
2eaf0 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
2eb00 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
2eb10 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20     u16 szCell = 
2eb20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2eb30 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75  e, pCell);.    u
2eb40 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61  8 *pStop;..    a
2eb50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2eb60 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2eb70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  New->pDbPage) );
2eb80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2eb90 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50  ge->aData[0]==(P
2eba0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2ebb0 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
2ebc0 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
2ebd0 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45  (pNew, PTF_INTKE
2ebe0 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
2ebf0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73  TF_LEAF);.    as
2ec00 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
2ec10 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43   1, &pCell, &szC
2ec20 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ell);..    /* If
2ec30 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2ec40 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2ec50 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2ec60 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20  nter map.    ** 
2ec70 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
2ec80 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
2ec90 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
2eca0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  rom the .    ** 
2ecb0 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
2ecc0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2ecd0 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20  page. If either 
2ece0 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20  of these.    ** 
2ecf0 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73  operations fails
2ed00 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  , the return cod
2ed10 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68  e is set, but th
2ed20 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a  e contents.    *
2ed30 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  * of the parent 
2ed40 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d  page are still m
2ed50 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68  anipulated by th
2ed60 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20  h code below..  
2ed70 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c    ** That is Ok,
2ed80 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   at this point t
2ed90 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
2eda0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  s guaranteed to.
2edb0 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64      ** be marked
2edc0 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72   as dirty. Retur
2edd0 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
2ede0 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a  de will cause a.
2edf0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c      ** rollback,
2ee00 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61   undoing any cha
2ee10 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
2ee20 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
2ee30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2ee40 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2ee50 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2ee60 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
2ee70 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
2ee80 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
2ee90 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70      if( szCell>p
2eea0 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b  New->minLocal ){
2eeb0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
2eec0 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20  utOvflPtr(pNew, 
2eed0 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20  pCell, &rc);.   
2eee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
2eef0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69    /* Create a di
2ef00 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e  vider cell to in
2ef10 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e  sert into pParen
2ef20 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63  t. The divider c
2ef30 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  ell.    ** consi
2ef40 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20  sts of a 4-byte 
2ef50 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65  page number (the
2ef60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2ef70 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a  pPage) and.    *
2ef80 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  * a variable len
2ef90 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77  gth key value (w
2efa0 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65  hich must be the
2efb0 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74   same value as t
2efc0 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73  he.    ** larges
2efd0 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e  t key on pPage).
2efe0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2eff0 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65  o find the large
2f000 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20  st key value on 
2f010 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e  pPage, first fin
2f020 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  d the right-most
2f030 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
2f040 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73   pPage. The firs
2f050 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20  t two fields of 
2f060 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68  this cell are th
2f070 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64  e .    ** record
2f080 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61  -length (a varia
2f090 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2f0a0 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69  er at most 32-bi
2f0b0 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20  ts in size).    
2f0c0 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76  ** and the key v
2f0d0 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65  alue (a variable
2f0e0 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c   length integer,
2f0f0 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61   may have any va
2f100 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65  lue)..    ** The
2f110 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68   first of the wh
2f120 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62  ile(...) loops b
2f130 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20  elow skips over 
2f140 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74  the record-lengt
2f150 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20  h.    ** field. 
2f160 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65  The second while
2f170 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65  (...) loop copie
2f180 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  s the key value 
2f190 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
2f1a0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e  cell on pPage in
2f1b0 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
2f1c0 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ffer..    */.   
2f1d0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2f1e0 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
2f1f0 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53  nCell-1);.    pS
2f200 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
2f210 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70  .    while( (*(p
2f220 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26  Cell++)&0x80) &&
2f230 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
2f240 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
2f250 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
2f260 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20  ( ((*(pOut++) = 
2f270 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30  *(pCell++))&0x80
2f280 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2f290 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65   );..    /* Inse
2f2a0 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  rt the new divid
2f2b0 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61  er cell into pPa
2f2c0 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73  rent. */.    ins
2f2d0 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
2f2e0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c   pParent->nCell,
2f2f0 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70   pSpace, (int)(p
2f300 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20  Out-pSpace),.   
2f310 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
2f320 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  Page->pgno, &rc)
2f330 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
2f340 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  e right-child po
2f350 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74  inter of pParent
2f360 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2f370 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
2f380 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
2f390 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2f3a0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2f3b0 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20  , pgnoNew);.  . 
2f3c0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
2f3d0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2f3e0 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
2f3f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f400 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNew);.  }..  re
2f410 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
2f420 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2f430 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
2f440 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68  ..#if 0./*.** Th
2f450 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
2f460 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
2f470 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
2f480 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c  operation of SQL
2f490 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f  ite..** it is so
2f4a0 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65  metimes activate
2f4b0 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68  d temporarily wh
2f4c0 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f  ile debugging co
2f4d0 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a  de responsible .
2f4e0 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70  ** for setting p
2f4f0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2f500 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2f510 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67  t ptrmapCheckPag
2f520 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50  es(MemPage **apP
2f530 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  age, int nPage){
2f540 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66  .  int i, j;.  f
2f550 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b  or(i=0; i<nPage;
2f560 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20   i++){.    Pgno 
2f570 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20  n;.    u8 e;.   
2f580 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2f590 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20  = apPage[i];.   
2f5a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2f5b0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20   pPage->pBt;.   
2f5c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2f5d0 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66  isInit );..    f
2f5e0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d  or(j=0; j<pPage-
2f5f0 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  >nCell; j++){.  
2f600 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2f610 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a  o;.      u8 *z;.
2f620 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20       .      z = 
2f630 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2f640 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  j);.      btreeP
2f650 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2f660 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  e, z, &info);.  
2f670 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
2f680 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
2f690 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
2f6a0 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69  t4byte(&z[info.i
2f6b0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
2f6c0 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2f6d0 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29  t, ovfl, &e, &n)
2f6e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f6f0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2f700 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56   && e==PTRMAP_OV
2f710 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20  ERFLOW1 );.     
2f720 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
2f730 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f740 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2f750 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20  = get4byte(z);. 
2f760 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
2f770 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2f780 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2f790 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2f7a0 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2f7b0 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20  P_BTREE );.     
2f7c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2f7d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2f7e0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
2f7f0 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
2f800 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2f810 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2f820 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74  .      ptrmapGet
2f830 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2f840 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65   &n);.      asse
2f850 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2f860 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2f870 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20  BTREE );.    }. 
2f880 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2f890 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2f8a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f8b0 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65  used to copy the
2f8c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2f8d0 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f   b-tree node sto
2f8e0 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20  red .** on page 
2f8f0 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2f900 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d  o. If page pFrom
2f910 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20   was not a leaf 
2f920 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  page, then.** th
2f930 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2f940 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63  tries for each c
2f950 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70  hild page are up
2f960 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2f970 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65  e.** parent page
2f980 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
2f990 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61  ointer map is pa
2f9a0 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d  ge pTo. If pFrom
2f9b0 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e   contained.** an
2f9c0 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65  y cells with ove
2f9d0 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
2f9e0 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
2f9f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e  rresponding poin
2fa00 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
2fa10 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61  es are also upda
2fa20 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ted so that the 
2fa30 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70  parent page is p
2fa40 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49  age pTo..**.** I
2fa50 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65  f pFrom is curre
2fa60 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e  ntly carrying an
2fa70 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  y overflow cells
2fa80 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65   (entries in the
2fa90 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66  .** MemPage.aOvf
2faa0 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
2fab0 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
2fac0 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
2fad0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
2fae0 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
2faf0 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
2fb00 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
2fb10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66  ..**.** The perf
2fb20 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20  ormance of this 
2fb30 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
2fb40 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20  critical. It is 
2fb50 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a  only used by .**
2fb60 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61   the balance_sha
2fb70 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c  llower() and bal
2fb80 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72  ance_deeper() pr
2fb90 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65  ocedures, neithe
2fba0 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72  r of.** which ar
2fbb0 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75  e called often u
2fbc0 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
2fbd0 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74  umstances..*/.st
2fbe0 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f  atic void copyNo
2fbf0 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67  deContent(MemPag
2fc00 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67  e *pFrom, MemPag
2fc10 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43  e *pTo, int *pRC
2fc20 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
2fc30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fc40 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e    BtShared * con
2fc50 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e  st pBt = pFrom->
2fc60 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  pBt;.    u8 * co
2fc70 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f  nst aFrom = pFro
2fc80 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38  m->aData;.    u8
2fc90 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70   * const aTo = p
2fca0 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  To->aData;.    i
2fcb0 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64  nt const iFromHd
2fcc0 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66  r = pFrom->hdrOf
2fcd0 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f  fset;.    int co
2fce0 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70  nst iToHdr = ((p
2fcf0 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31  To->pgno==1) ? 1
2fd00 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  00 : 0);.    int
2fd10 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61   rc;.    int iDa
2fd20 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73  ta;.  .  .    as
2fd30 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49  sert( pFrom->isI
2fd40 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nit );.    asser
2fd50 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e  t( pFrom->nFree>
2fd60 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61  =iToHdr );.    a
2fd70 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
2fd80 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
2fd90 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  5]) <= (int)pBt-
2fda0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2fdb0 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68   .    /* Copy th
2fdc0 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
2fdd0 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
2fde0 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2fdf0 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20  o. */.    iData 
2fe00 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
2fe10 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
2fe20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
2fe30 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
2fe40 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
2fe50 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
2fe60 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
2fe70 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
2fe80 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
2fe90 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
2fea0 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pFrom->nCell);. 
2feb0 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69   .    /* Reiniti
2fec0 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
2fed0 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
2fee0 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
2fef0 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  ge structure.   
2ff00 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
2ff10 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
2ff20 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
2ff30 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66  o can actually f
2ff40 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  ail under.    **
2ff50 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
2ff60 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65  circumstances, e
2ff70 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
2ff80 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69   a copy of initi
2ff90 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70  alized .    ** p
2ffa0 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a  age pFrom..    *
2ffb0 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69  /.    pTo->isIni
2ffc0 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
2ffd0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54  btreeInitPage(pT
2ffe0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
2fff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30000 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
30010 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
30020 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
30030 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
30040 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
30050 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
30060 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
30070 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d     ** for any b-
30080 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
30090 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
300a0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
300b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20   pointers to..  
300c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
300d0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
300e0 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69     *pRC = setChi
300f0 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
30100 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
30110 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
30120 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65  redistributes ce
30130 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65  lls on the iPare
30140 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f  ntIdx'th child o
30150 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65  f pParent.** (he
30160 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67  reafter "the pag
30170 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20  e") and up to 2 
30180 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74  siblings so that
30190 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
301a0 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d  about the.** sam
301b0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
301c0 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20   space. Usually 
301d0 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67  a single sibling
301e0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
301f0 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61  of the.** page a
30200 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  re used in the b
30210 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68  alancing, though
30220 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d   both siblings m
30230 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
30240 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68  ne.** side if th
30250 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
30260 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  rst or last chil
30270 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
30280 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a   If the page .**
30290 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
302a0 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65  2 siblings (some
302b0 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
302c0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
302d0 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20  he page.** is a 
302e0 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63  root page or a c
302f0 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70  hild of a root p
30300 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  age) then all av
30310 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
30320 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20  .** participate 
30330 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
30340 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
30350 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
30360 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74  f the page might
30370 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
30380 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a   decreased by .*
30390 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20  * one or two in 
303a0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
303b0 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
303c0 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
303d0 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f   full. .**.** No
303e0 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
303f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
30400 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
30410 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
30420 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
30430 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
30440 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44  ed in MemPage.aD
30450 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20  ata[]. This can 
30460 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
30470 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
30480 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  l. This routine 
30490 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c  ensures that all
304a0 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64   cells allocated
304b0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
304c0 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
304d0 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67   fit into MemPag
304e0 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65  e.aData[] before
304f0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
30500 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
30510 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
30520 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
30530 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61  blings, cells ma
30540 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  y be.** inserted
30550 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64   into or removed
30560 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
30570 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e   page (pParent).
30580 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79   Doing so.** may
30590 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e   cause the paren
305a0 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65  t page to become
305b0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
305c0 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a  erfull. If this.
305d0 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  ** happens, it i
305e0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
305f0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
30600 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  er to invoke the
30610 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61   correct.** bala
30620 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f  ncing routine to
30630 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
30640 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e  m (see the balan
30650 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a  ce() routine). .
30660 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
30670 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
30680 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
30690 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
306a0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
306b0 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
306c0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
306d0 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
306e0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
306f0 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
30700 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ..**.** The thir
30710 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
30720 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76  is function, aOv
30730 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f  flSpace, is a po
30740 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75  inter to a.** bu
30750 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20  ffer big enough 
30760 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65  to hold one page
30770 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72  . If while inser
30780 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
30790 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
307a0 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65  ge (pParent) the
307b0 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
307c0 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
307d0 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  his buffer is.**
307e0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
307f0 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72  he parent's over
30800 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
30810 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
30820 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
30830 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
30840 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
30850 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
30860 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
30870 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
30880 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
30890 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
308a0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
308b0 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
308c0 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
308d0 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
308e0 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
308f0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
30900 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
30910 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
30920 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
30930 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
30940 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
30950 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
30960 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
30970 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
30980 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
30990 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
309a0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
309b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
309c0 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
309d0 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
309e0 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
309f0 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
30a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30a10 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
30a20 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
30a30 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
30a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30a50 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
30a60 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
30a70 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
30a80 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20  .  int isRoot   
30a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30aa0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
30ab0 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
30ac0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  page */.){.  BtS
30ad0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
30ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30af0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
30b00 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
30b10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30b20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
30b30 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
30b40 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
30b50 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
30b60 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
30b70 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
30b80 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
30b90 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  /.  int nNew = 0
30ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30bb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
30bc0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
30bd0 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
30be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
30c00 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
30c10 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
30c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c30 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
30c40 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  s */.  int nxDiv
30c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30c60 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
30c70 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
30c80 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
30c90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30ca0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
30cb0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
30cc0 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43  e */.  u16 leafC
30cd0 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
30ce0 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
30cf0 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
30d00 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
30d10 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
30d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
30d30 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
30d40 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
30d50 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
30d60 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
30d70 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
30d80 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
30d90 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
30da0 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
30db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30dc0 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
30dd0 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
30de0 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
30df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e00 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
30e10 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
30e20 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
30e30 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20  iSpace1 = 0;    
30e40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
30e50 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
30e60 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20   aSpace1[] */.  
30e70 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d  int iOvflSpace =
30e80 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
30e90 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
30ea0 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b  e of aOvflSpace[
30eb0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
30ec0 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
30ed0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
30ee0 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
30ef0 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
30f00 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
30f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
30f20 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
30f30 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d   siblings */.  M
30f40 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
30f50 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
30f60 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
30f70 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
30f80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
30f90 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
30fa0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
30fb0 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
30fc0 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
30fd0 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b  */.  u8 *pRight;
30fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ff0 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e    /* Location in
31000 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74   parent of right
31010 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72  -sibling pointer
31020 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
31030 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20  NB-1];          
31040 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
31050 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
31060 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
31070 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
31080 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
31090 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
310a0 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
310b0 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
310c0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
310d0 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
310e0 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
310f0 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
31100 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
31110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31120 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
31130 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
31140 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
31150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
31160 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
31170 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
31180 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
31190 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ce1;            
311a0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
311b0 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
311c0 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  ders cells */.  
311d0 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
311f0 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72  Temp var to stor
31200 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  e a page number 
31210 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  in */..  pBt = p
31220 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61  Parent->pBt;.  a
31230 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31240 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
31250 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
31260 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
31270 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
31280 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
31290 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28  .#if 0.  TRACE((
312a0 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20  "BALANCE: begin 
312b0 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66  page %d child of
312c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
312d0 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  gno, pParent->pg
312e0 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  no));.#endif..  
312f0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
31300 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76   pParent may hav
31310 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76  e at most one ov
31320 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64  erflow cell. And
31330 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76   if.  ** this ov
31340 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70  erflow cell is p
31350 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20  resent, it must 
31360 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  be the cell with
31370 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61   .  ** index iPa
31380 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63  rentIdx. This sc
31390 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f  enario comes abo
313a0 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ut when this fun
313b0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61  ction.  ** is ca
313c0 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79  lled (indirectly
313d0 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  ) from sqlite3Bt
313e0 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a  reeDelete()..  *
313f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
31400 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
31410 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  0 || pParent->nO
31420 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
31430 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
31440 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
31450 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b   pParent->aOvfl[
31460 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49  0].idx==iParentI
31470 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f  dx );..  if( !aO
31480 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20  vflSpace ){.    
31490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
314a0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
314b0 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20  ind the sibling 
314c0 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65  pages to balance
314d0 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68  . Also locate th
314e0 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
314f0 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69  nt .  ** that di
31500 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67  vide the sibling
31510 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  s. An attempt is
31520 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
31530 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20   siblings on .  
31540 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  ** either side o
31550 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69  f pPage. More si
31560 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
31570 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
31580 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69  however, .  ** i
31590 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
315a0 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
315b0 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
315c0 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74  side. If pParent
315d0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
315e0 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
315f0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
31600 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
31610 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  taken.  .  **.  
31620 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
31630 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69  o drops the divi
31640 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  der cells from t
31650 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
31660 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74  This.  ** way, t
31670 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
31680 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
31690 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65  s not have to de
316a0 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a  al with any.  **
316b0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
316c0 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
316d0 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79  ge, since if any
316e0 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69   existed they wi
316f0 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72  ll.  ** have alr
31700 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65  eady been remove
31710 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50  d..  */.  i = pP
31720 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
31730 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   + pParent->nCel
31740 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a  l;.  if( i<2 ){.
31750 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
31760 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20     nOld = i+1;. 
31770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64   }else{.    nOld
31780 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50   = 3;.    if( iP
31790 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20  arentIdx==0 ){  
317a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
317b0 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b        nxDiv = 0;
317c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
317d0 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a  ParentIdx==i ){.
317e0 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d        nxDiv = i-
317f0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
31800 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72      nxDiv = iPar
31810 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a  entIdx-1;.    }.
31820 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20      i = 2;.  }. 
31830 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50   if( (i+nxDiv-pP
31840 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
31850 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  )==pParent->nCel
31860 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20  l ){.    pRight 
31870 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  = &pParent->aDat
31880 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
31890 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65  fset+8];.  }else
318a0 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66  {.    pRight = f
318b0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
318c0 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
318d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
318e0 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62  }.  pgno = get4b
318f0 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77  yte(pRight);.  w
31900 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72  hile( 1 ){.    r
31910 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
31920 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61  ge(pBt, pgno, &a
31930 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
31940 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( rc ){.      me
31950 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
31960 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
31970 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
31980 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
31990 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
319a0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
319b0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
319c0 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
319d0 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
319e0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
319f0 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50   if( i+nxDiv==pP
31a00 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
31a10 69 64 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  idx && pParent->
31a20 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
31a30 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50     apDiv[i] = pP
31a40 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
31a50 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e  pCell;.      pgn
31a60 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
31a70 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
31a80 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
31a90 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
31aa0 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  Div[i]);.      p
31ab0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31ac0 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  w = 0;.    }else
31ad0 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
31ae0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
31af0 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
31b00 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
31b10 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
31b20 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
31b30 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
31b40 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
31b50 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
31b60 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72  ]);..      /* Dr
31b70 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  op the cell from
31b80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31b90 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c  . apDiv[i] still
31ba0 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20   points to.     
31bb0 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74   ** the cell wit
31bc0 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20  hin the parent, 
31bd0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68  even though it h
31be0 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e  as been dropped.
31bf0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
31c00 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64  s safe because d
31c10 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f  ropping a cell o
31c20 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74  nly overwrites t
31c30 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
31c40 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
31c50 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  it, and this fun
31c60 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ction does not n
31c70 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  eed the first.  
31c80 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
31c90 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
31ca0 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f   cell. So the po
31cb0 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f  inter is safe to
31cc0 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61   use.      ** la
31cd0 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20  ter on.  .      
31ce0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
31cf0 73 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  ss SQLite is com
31d00 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d  piled in secure-
31d10 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
31d20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20  this case,.     
31d30 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c   ** the dropCell
31d40 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
31d50 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e  overwrite the en
31d60 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a  tire cell with z
31d70 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  eroes..      ** 
31d80 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65  In this case, te
31d90 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74  mporarily copy t
31da0 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  he cell into the
31db0 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20   aOvflSpace[].  
31dc0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49      ** buffer. I
31dd0 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  t will be copied
31de0 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f   out again as so
31df0 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65  on as the aSpace
31e00 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20  [] buffer.      
31e10 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  ** is allocated.
31e20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
31e30 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
31e40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
31e50 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54  iOff = SQLITE_PT
31e60 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69  R_TO_INT(apDiv[i
31e70 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ]) - SQLITE_PTR_
31e80 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e  TO_INT(pParent->
31e90 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
31ea0 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b  if( (iOff+szNew[
31eb0 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73  i])>(int)pBt->us
31ec0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
31ed0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31ee0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
31ef0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
31f00 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29  (apOld, 0, (i+1)
31f10 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
31f20 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ));.          go
31f30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
31f40 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  up;.        }els
31f50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
31f60 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b  cpy(&aOvflSpace[
31f70 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c  iOff], apDiv[i],
31f80 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20   szNew[i]);.    
31f90 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
31fa0 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44   &aOvflSpace[apD
31fb0 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61  iv[i]-pParent->a
31fc0 44 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d  Data];.        }
31fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
31fe0 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
31ff0 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
32000 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e  ->nOverflow, szN
32010 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ew[i], &rc);.   
32020 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
32030 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
32040 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
32050 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
32060 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
32070 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
32080 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
32090 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
320a0 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
320b0 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
320c0 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
320d0 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65  .  k = pBt->page
320e0 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69  Size + ROUND8(si
320f0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
32100 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
32110 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
32120 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
32130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32140 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
32150 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
32160 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
32170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32180 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
32190 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
321a0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
321b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321c0 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
321d0 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20      + k*nOld;   
321e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32200 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73    /* Page copies
32210 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61   (apCopy) */.  a
32220 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  pCell = sqlite3S
32230 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a  cratchMalloc( sz
32240 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66  Scratch ); .  if
32250 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
32260 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
32270 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
32280 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
32290 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
322a0 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  u16*)&apCell[nMa
322b0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63  xCells];.  aSpac
322c0 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  e1 = (u8*)&szCel
322d0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
322e0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
322f0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70  TE_ALIGNMENT(aSp
32300 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  ace1) );..  /*. 
32310 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72   ** Load pointer
32320 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  s to all cells o
32330 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  n sibling pages 
32340 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20  and the divider 
32350 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
32360 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c  the local apCell
32370 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20  [] array.  Make 
32380 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69  copies of the di
32390 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
323a0 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
323b0 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65  ined from aSpace
323c0 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  1[] and remove t
323d0 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43  he the divider C
323e0 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
323f0 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
32400 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
32410 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
32420 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
32430 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
32440 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
32450 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
32460 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
32470 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
32480 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
32490 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
324a0 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
324b0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
324c0 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
324d0 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
324e0 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
324f0 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
32500 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
32510 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
32520 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
32530 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
32540 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
32550 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
32560 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
32570 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
32580 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
32590 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
325a0 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
325b0 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
325c0 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
325d0 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
325e0 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
325f0 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
32600 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43  ys..  */.  leafC
32610 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
32620 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
32630 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
32640 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
32650 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
32660 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
32670 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f  imit;.    .    /
32680 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
32690 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61  nything else, ta
326a0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
326b0 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73   i'th original s
326c0 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68  ibling.    ** Th
326d0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
326e0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
326f0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
32700 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20  opies rather.   
32710 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
32720 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
32730 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
32740 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
32750 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
32760 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
32770 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
32780 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
32790 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
327a0 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b  mPage*)&aSpace1[
327b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
327c0 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  k*i];.    memcpy
327d0 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c  (pOld, apOld[i],
327e0 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
327f0 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61  );.    pOld->aDa
32800 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c  ta = (void*)&pOl
32810 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d[1];.    memcpy
32820 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70  (pOld->aData, ap
32830 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
32840 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
32850 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64      limit = pOld
32860 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
32870 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
32880 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
32890 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  >0 ){.      for(
328a0 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
328b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
328c0 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
328d0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61  lls );.        a
328e0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
328f0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
32900 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
32910 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
32920 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
32930 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
32940 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  ]);.        nCel
32950 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
32960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
32970 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e   *aData = pOld->
32980 61 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36  aData;.      u16
32990 20 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64   maskPage = pOld
329a0 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20  ->maskPage;.    
329b0 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
329c0 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66   = pOld->cellOff
329d0 73 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  set;.      for(j
329e0 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
329f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
32a00 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
32a10 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
32a20 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
32a30 6e 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20  ndCellv2(aData, 
32a40 6d 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66  maskPage, cellOf
32a50 66 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20  fset, j);.      
32a60 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
32a70 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
32a80 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
32a90 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  ]);.        nCel
32aa0 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
32ab0 20 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66   }       .    if
32ac0 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c  ( i<nOld-1 && !l
32ad0 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20  eafData){.      
32ae0 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a  u16 sz = (u16)sz
32af0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38  New[i];.      u8
32b00 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61   *pTemp;.      a
32b10 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
32b20 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
32b30 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
32b40 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  sz;.      pTemp 
32b50 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
32b60 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63  e1];.      iSpac
32b70 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
32b80 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
32b90 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
32ba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
32bb0 70 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42  pace1 <= (int)pB
32bc0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
32bd0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
32be0 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
32bf0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
32c00 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
32c10 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
32c20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
32c30 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c  Correction==0 ||
32c40 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
32c50 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  =4 );.      szCe
32c60 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65  ll[nCell] = szCe
32c70 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66  ll[nCell] - leaf
32c80 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
32c90 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
32ca0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  f ){.        ass
32cb0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
32cc0 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
32cd0 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e    assert( pOld->
32ce0 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  hdrOffset==0 );.
32cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
32d00 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
32d10 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
32d20 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
32d30 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  left.        ** 
32d40 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
32d50 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
32d60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
32d70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
32d80 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  ld->aData[8], 4)
32d90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32da0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
32db0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
32dc0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
32dd0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
32de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
32df0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
32e00 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
32e10 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
32e20 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
32e30 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
32e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32e50 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
32e60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
32e70 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
32e80 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
32e90 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
32ea0 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
32eb0 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
32ec0 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
32ed0 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
32ee0 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
32ef0 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
32f00 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
32f10 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
32f20 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
32f30 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
32f40 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
32f50 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
32f60 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
32f70 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
32f80 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
32f90 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
32fa0 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
32fb0 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
32fc0 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
32fd0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
32fe0 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
32ff0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
33000 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
33010 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
33020 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
33030 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
33040 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
33050 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
33060 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
33070 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
33080 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
33090 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
330a0 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
330b0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
330c0 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
330d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
330e0 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
330f0 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
33100 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
33110 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
33120 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
33130 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
33140 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
33150 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
33160 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
33170 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
33180 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
33190 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
331a0 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
331b0 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
331c0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
331d0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
331e0 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
331f0 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
33200 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
33210 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
33220 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
33230 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
33240 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20       if( k>NB+1 
33250 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  ){ rc = SQLITE_C
33260 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74  ORRUPT_BKPT; got
33270 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
33280 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p; }.    }.  }. 
33290 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
332a0 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
332b0 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
332c0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
332d0 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
332e0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
332f0 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
33300 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
33310 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
33320 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
33330 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
33340 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
33350 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
33360 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
33370 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
33380 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
33390 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
333a0 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
333b0 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
333c0 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
333d0 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
333e0 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
333f0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
33400 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
33410 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
33420 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
33430 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
33440 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
33450 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
33460 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
33470 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
33480 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
33490 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
334a0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
334b0 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
334c0 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
334d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
334e0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
334f0 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
33500 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
33510 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
33520 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
33530 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
33540 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
33550 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
33560 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
33570 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
33580 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
33590 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
335a0 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
335b0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
335c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
335d0 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
335e0 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
335f0 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
33600 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
33610 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
33620 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
33630 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
33640 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
33650 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
33660 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
33670 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
33680 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
33690 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
336a0 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
336b0 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
336c0 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
336d0 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
336e0 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
336f0 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
33700 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
33710 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
33720 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
33730 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
33740 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
33750 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
33760 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
33770 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
33780 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
33790 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
337a0 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
337b0 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
337c0 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
337d0 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
337e0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
337f0 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
33800 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
33810 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
33820 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
33830 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
33840 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
33850 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
33860 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
33870 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
33880 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  =0) );..  TRACE(
33890 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
338a0 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20  %d %d %d  ",.   
338b0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c   apOld[0]->pgno,
338c0 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
338d0 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apOld[1]->pgno :
338e0 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
338f0 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f  ? apOld[2]->pgno
33900 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a   : 0.  ));..  /*
33910 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
33920 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
33930 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
33940 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
33950 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d  /.  if( apOld[0]
33960 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20  ->pgno<=1 ){.   
33970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
33980 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
33990 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
339a0 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46  nup;.  }.  pageF
339b0 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  lags = apOld[0]-
339c0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
339d0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
339e0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
339f0 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
33a00 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
33a10 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
33a20 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
33a30 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
33a40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33a50 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
33a60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
33a70 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
33a80 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
33a90 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
33aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
33ab0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
33ac0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
33ad0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
33ae0 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f  New, &pgno, pgno
33af0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
33b00 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
33b10 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
33b20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
33b30 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
33b40 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
33b50 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
33b60 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
33b70 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
33b80 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
33b90 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
33ba0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
33bb0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54  , pNew->pgno, PT
33bc0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
33bd0 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  ent->pgno, &rc);
33be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
33bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33c00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
33c10 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
33c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33c30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
33c40 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
33c50 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
33c60 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
33c70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
33c80 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
33c90 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64    freePage(apOld
33ca0 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  [i], &rc);.    i
33cb0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
33cc0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
33cd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
33ce0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
33cf0 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
33d00 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
33d10 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
33d20 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
33d30 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
33d40 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
33d50 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
33d60 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
33d70 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
33d80 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
33d90 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
33da0 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
33db0 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
33dc0 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
33dd0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
33de0 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
33df0 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
33e00 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
33e10 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
33e20 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
33e30 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
33e40 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
33e50 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
33e60 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
33e70 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
33e80 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
33e90 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
33ea0 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
33eb0 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
33ec0 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
33ed0 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
33ee0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
33ef0 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
33f00 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
33f10 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
33f20 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
33f30 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
33f40 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
33f50 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b   apNew[i]->pgno;
33f60 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
33f70 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
33f80 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
33f90 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d     if( apNew[j]-
33fa0 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29  >pgno<(unsigned)
33fb0 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
33fc0 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
33fd0 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a    minV = apNew[j
33fe0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ]->pgno;.      }
33ff0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
34000 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d  inI>i ){.      M
34010 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
34020 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b    pT = apNew[i];
34030 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
34040 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
34050 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d       apNew[minI]
34060 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pT;.    }.  }
34070 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20  .  TRACE(("new: 
34080 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
34090 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
340a0 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77  d)\n",.    apNew
340b0 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77  [0]->pgno, szNew
340c0 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
340d0 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e   ? apNew[1]->pgn
340e0 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  o : 0, nNew>=2 ?
340f0 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
34100 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e     nNew>=3 ? apN
34110 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[2]->pgno : 0,
34120 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
34130 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
34140 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d  w>=4 ? apNew[3]-
34150 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
34160 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20  =4 ? szNew[3] : 
34170 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f  0,.    nNew>=5 ?
34180 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20   apNew[4]->pgno 
34190 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
341a0 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
341b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
341c0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
341d0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
341e0 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ge) );.  put4byt
341f0 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b  e(pRight, apNew[
34200 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
34210 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c  .  /*.  ** Evenl
34220 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65  y distribute the
34230 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b   data in apCell[
34240 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77  ] across the new
34250 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73   pages..  ** Ins
34260 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ert divider cell
34270 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61  s into pParent a
34280 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
34290 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  j = 0;.  for
342a0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
342b0 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d  +){.    /* Assem
342c0 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c  ble the new sibl
342d0 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
342e0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
342f0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61   apNew[i];.    a
34300 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
34310 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  ls );.    zeroPa
34320 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
34330 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  gs);.    assembl
34340 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
34350 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
34360 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
34370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
34380 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
34390 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
343a0 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
343b0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
343c0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
343d0 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
343e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
343f0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
34400 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
34410 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
34420 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
34430 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
34440 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
34450 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
34460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
34470 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20  rt( i<nNew-1 || 
34480 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  j==nCell );.    
34490 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20  if( j<nCell ){. 
344a0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
344b0 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
344c0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a  .      int sz;..
344d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
344e0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
344f0 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c     pCell = apCel
34500 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d  l[j];.      sz =
34510 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61   szCell[j] + lea
34520 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
34530 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66     pTemp = &aOvf
34540 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63  lSpace[iOvflSpac
34550 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e];.      if( !p
34560 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  New->leaf ){.   
34570 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
34580 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65  w->aData[8], pCe
34590 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  ll, 4);.      }e
345a0 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
345b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
345c0 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
345d0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
345e0 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
345f0 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
34600 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
34610 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
34620 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
34630 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
34640 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
34650 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
34660 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
34670 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
34680 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
34690 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
346a0 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
346b0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
346c0 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
346d0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
346e0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
346f0 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  -;.        btree
34700 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65  ParseCellPtr(pNe
34710 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69  w, apCell[j], &i
34720 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43  nfo);.        pC
34730 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
34740 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75       sz = 4 + pu
34750 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
34760 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20  ], info.nKey);. 
34770 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
34780 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34790 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
347a0 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62  4;.        /* Ob
347b0 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e  scure case for n
347c0 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65  on-leaf-data tre
347d0 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  es: If the cell 
347e0 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20  at pCell was.   
347f0 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
34800 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c  ly stored on a l
34810 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74  eaf node, and it
34820 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20  s reported size 
34830 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a  was 4.        **
34840 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20   bytes, then it 
34850 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20  may actually be 
34860 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69  smaller than thi
34870 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73  s .        ** (s
34880 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ee btreeParseCel
34890 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20  lPtr(), 4 bytes 
348a0 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73  is the minimum s
348b0 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ize of.        *
348c0 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74  * any cell). But
348d0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
348e0 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72   to pass the cor
348f0 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20  rect size to .  
34900 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43        ** insertC
34910 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73  ell(), so repars
34920 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a  e the cell now..
34930 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
34940 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
34950 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68  this can never h
34960 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69  appen in an SQLi
34970 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73  te data file, as
34980 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
34990 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61  cells are at lea
349a0 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f  st 4 bytes. It o
349b0 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62  nly happens in b
349c0 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20  -trees used.    
349d0 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61      ** to evalua
349e0 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e  te "IN (SELECT .
349f0 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72  ..)" and similar
34a00 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
34a10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
34a20 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b   szCell[j]==4 ){
34a30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
34a40 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t(leafCorrection
34a50 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==4);.          
34a60 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
34a70 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29  (pParent, pCell)
34a80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34a90 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53    }.      iOvflS
34aa0 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
34ab0 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
34ac0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29  t->maxLocal+23 )
34ad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34ae0 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69  iOvflSpace <= (i
34af0 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  nt)pBt->pageSize
34b00 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74   );.      insert
34b10 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
34b20 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
34b30 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e  pTemp, pNew->pgn
34b40 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
34b50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34b60 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
34b70 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
34b80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
34b90 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
34ba0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
34bb0 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a   );..      j++;.
34bc0 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
34bd0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
34be0 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
34bf0 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
34c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
34c10 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
34c20 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
34c30 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38  AF)==0 ){.    u8
34c40 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f   *zChild = &apCo
34c50 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
34c60 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  a[8];.    memcpy
34c70 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
34c80 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c  >aData[8], zChil
34c90 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  d, 4);.  }..  if
34ca0 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72  ( isRoot && pPar
34cb0 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  ent->nCell==0 &&
34cc0 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66   pParent->hdrOff
34cd0 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  set<=apNew[0]->n
34ce0 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Free ){.    /* T
34cf0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
34d00 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63  the b-tree now c
34d10 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
34d20 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69  . The only sibli
34d30 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69  ng.    ** page i
34d40 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
34d50 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e  d of the parent.
34d60 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
34d70 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
34d80 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f   child page into
34d90 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63   the parent, dec
34da0 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72  reasing the over
34db0 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68  all height of th
34dc0 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20  e.    ** b-tree 
34dd0 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65  structure by one
34de0 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69  . This is descri
34df0 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61  bed as the "bala
34e00 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20  nce-shallower". 
34e10 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69     ** sub-algori
34e20 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75  thm in some docu
34e30 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  mentation..    *
34e40 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
34e50 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
34e60 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  um database, the
34e70 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64   call to copyNod
34e80 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20  eContent() .    
34e90 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e  ** sets all poin
34ea0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
34eb0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
34ec0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
34ed0 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f  pages .    ** fo
34ee0 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e  r which the poin
34ef0 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69  ter is stored wi
34f00 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  thin the content
34f10 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20   being copied.. 
34f20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
34f30 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62   second assert b
34f40 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
34f50 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  at the child pag
34f60 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
34f70 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73  d.    ** (it mus
34f80 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20  t be, as it was 
34f90 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74  just reconstruct
34fa0 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c  ed using assembl
34fb0 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20  ePage()). This. 
34fc0 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61     ** is importa
34fd0 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  nt if the parent
34fe0 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
34ff0 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68   be page 1 of th
35000 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
35010 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20  * image.  */.   
35020 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31   assert( nNew==1
35030 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35040 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
35050 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74  == .        (get
35060 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d  2byte(&apNew[0]-
35070 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77  >aData[5])-apNew
35080 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d  [0]->cellOffset-
35090 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a  apNew[0]->nCell*
350a0 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  2) .    );.    c
350b0 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61  opyNodeContent(a
350c0 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74  pNew[0], pParent
350d0 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65  , &rc);.    free
350e0 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26  Page(apNew[0], &
350f0 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rc);.  }else if(
35100 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
35110 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20  .    /* Fix the 
35120 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
35130 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20  ies for all the 
35140 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20  cells that were 
35150 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20  shifted around. 
35160 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
35170 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  e several differ
35180 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69  ent types of poi
35190 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
351a0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20   that need to.  
351b0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
351c0 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  th by this routi
351d0 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73  ne. Some of thes
351e0 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  e have been set 
351f0 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20  already, but.   
35200 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f   ** many have no
35210 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t. The following
35220 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20   is a summary:. 
35230 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31     **.    **   1
35240 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73  ) The entries as
35250 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65  sociated with ne
35260 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  w sibling pages 
35270 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20  that were not.  
35280 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e    **      siblin
35290 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  gs when this fun
352a0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
352b0 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72  . These have alr
352c0 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  eady.    **     
352d0 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f   been set. We do
352e0 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72  n't need to worr
352f0 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c  y about old sibl
35300 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20  ings that were. 
35310 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64     **      moved
35320 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
35330 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65  t - the freePage
35340 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65  () code has take
35350 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20  n care.    **   
35360 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20     of those..   
35370 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20   **.    **   2) 
35380 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  The pointer-map 
35390 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
353a0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
353b0 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a  t overflow.    *
353c0 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61  *      page in a
353d0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ny overflow chai
353e0 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64  ns used by new d
353f0 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68  ivider cells. Th
35400 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ese .    **     
35410 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61   have also alrea
35420 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61  dy been taken ca
35430 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73  re of by the ins
35440 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a  ertCell() code..
35450 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
35460 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  3) If the siblin
35470 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
35480 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
35490 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a   child pages of.
354a0 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c      **      cell
354b0 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  s stored on the 
354c0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61  sibling pages ma
354d0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
354e0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
354f0 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20   **   4) If the 
35500 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
35510 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69  e not internal i
35520 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65  ntkey nodes, the
35530 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20  n any.    **    
35540 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    overflow pages
35550 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63   used by these c
35560 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ells may need to
35570 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20   be updated.    
35580 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61  **      (interna
35590 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e  l intkey nodes n
355a0 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69  ever contain poi
355b0 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f  nters to overflo
355c0 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a  w pages)..    **
355d0 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20  .    **   5) If 
355e0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
355f0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
35600 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
35610 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20  er-map.    **   
35620 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74     entries for t
35630 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
35640 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62  ages of each sib
35650 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20  ling may need.  
35660 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20    **      to be 
35670 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  updated..    **.
35680 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61      ** Cases 1 a
35690 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20 77  nd 2 are dealt w
356a0 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68  ith above by oth
356b0 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78  er code. The nex
356c0 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64  t.    ** block d
356d0 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73 20  eals with cases 
356e0 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20  3 and 4 and the 
356f0 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c 20  one after that, 
35700 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20  case 5. Since.  
35710 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70    ** setting a p
35720 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
35730 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79   is a relatively
35740 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
35750 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a  tion, this.    *
35760 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73  * code only sets
35770 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
35780 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f  ries for child o
35790 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
357a0 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a   that have.    *
357b0 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64  * actually moved
357c0 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20   between pages. 
357d0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
357e0 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d  *pNew = apNew[0]
357f0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
35800 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b  Old = apCopy[0];
35810 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c  .    int nOverfl
35820 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
35830 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e  flow;.    int iN
35840 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e  extOld = pOld->n
35850 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77  Cell + nOverflow
35860 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66  ;.    int iOverf
35870 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77  low = (nOverflow
35880 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30   ? pOld->aOvfl[0
35890 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20  ].idx : -1);.   
358a0 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
358b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358c0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27      /* Current '
358d0 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67  old' sibling pag
358e0 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20  e */.    k = 0; 
358f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
35910 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62  urrent 'new' sib
35920 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20  ling page */.   
35930 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
35940 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
35950 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30  nt isDivider = 0
35960 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
35970 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20  ==iNextOld ){.  
35980 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20        /* Cell i 
35990 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65  is the cell imme
359a0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
359b0 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  g the last cell 
359c0 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a  on old.        *
359d0 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a  * sibling page j
359e0 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  . If the sibling
359f0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70  s are not leaf p
35a00 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20  ages of an.     
35a10 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74     ** intkey b-t
35a20 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69  ree, then cell i
35a30 20 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63   was a divider c
35a40 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ell. */.        
35a50 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b  pOld = apCopy[++
35a60 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78  j];.        iNex
35a70 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66  tOld = i + !leaf
35a80 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65  Data + pOld->nCe
35a90 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ll + pOld->nOver
35aa0 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  flow;.        if
35ab0 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pOld->nOverflo
35ac0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  w ){.          n
35ad0 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d  Overflow = pOld-
35ae0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
35af0 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20        iOverflow 
35b00 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
35b10 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d  + pOld->aOvfl[0]
35b20 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a  .idx;.        }.
35b30 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65          isDivide
35b40 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20  r = !leafData;  
35b50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
35b60 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
35b70 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c  >0 || iOverflow<
35b80 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  i );.      asser
35b90 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c  t(nOverflow<2 ||
35ba0 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
35bb0 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c  idx==pOld->aOvfl
35bc0 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20  [1].idx-1);.    
35bd0 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
35be0 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f  ow<3 || pOld->aO
35bf0 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64  vfl[1].idx==pOld
35c00 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31  ->aOvfl[2].idx-1
35c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  );.      if( i==
35c20 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
35c30 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
35c40 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
35c50 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20  (--nOverflow)>0 
35c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76  ){.          iOv
35c70 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20  erflow++;.      
35c80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
35c90 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77     if( i==cntNew
35ca0 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  [k] ){.        /
35cb0 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20  * Cell i is the 
35cc0 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  cell immediately
35cd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
35ce0 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a  ast cell on new.
35cf0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69          ** sibli
35d00 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68  ng page k. If th
35d10 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  e siblings are n
35d20 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  ot leaf pages of
35d30 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
35d40 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68  ntkey b-tree, th
35d50 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64  en cell i is a d
35d60 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f  ivider cell.  */
35d70 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
35d80 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20  apNew[++k];.    
35d90 20 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74      if( !leafDat
35da0 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  a ) continue;.  
35db0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
35dc0 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20  rt( j<nOld );.  
35dd0 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e      assert( k<nN
35de0 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ew );..      /* 
35df0 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20  If the cell was 
35e00 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64  originally divid
35e10 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20  er cell (and is 
35e20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20  not now) or.    
35e30 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77    ** an overflow
35e40 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65   cell, or if the
35e50 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65   cell was locate
35e60 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  d on a different
35e70 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a   sibling.      *
35e80 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68  * page before th
35e90 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65  e balancing, the
35ea0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
35eb0 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
35ec0 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69  ated.      ** wi
35ed0 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20  th any child or 
35ee0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e  overflow pages n
35ef0 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
35f00 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
35f10 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f   isDivider || pO
35f20 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ld->pgno!=pNew->
35f30 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
35f40 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
35f50 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ion ){.         
35f60 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
35f70 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b  get4byte(apCell[
35f80 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  i]), PTRMAP_BTRE
35f90 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26  E, pNew->pgno, &
35fa0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
35fb0 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
35fc0 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  l[i]>pNew->minLo
35fd0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cal ){.         
35fe0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
35ff0 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69  r(pNew, apCell[i
36000 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ], &rc);.       
36010 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
36020 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43  ..    if( !leafC
36030 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  orrection ){.   
36040 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e     for(i=0; i<nN
36050 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ew; i++){.      
36060 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34    u32 key = get4
36070 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e  byte(&apNew[i]->
36080 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
36090 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
360a0 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54  , key, PTRMAP_BT
360b0 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  REE, apNew[i]->p
360c0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
360d0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a   }.    }..#if 0.
360e0 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61      /* The ptrma
360f0 70 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f  pCheckPages() co
36100 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20  ntains assert() 
36110 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
36120 76 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20  verify that.    
36130 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d  ** all pointer m
36140 61 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74  ap pages are set
36150 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73   correctly. This
36160 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c   is helpful whil
36170 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67  e .    ** debugg
36180 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75  ing. This is usu
36190 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65  ally disabled be
361a0 63 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20  cause a corrupt 
361b0 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20  database may.   
361c0 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73   ** cause an ass
361d0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
361e0 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20  to fail.  */.   
361f0 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
36200 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a  s(apNew, nNew);.
36210 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50      ptrmapCheckP
36220 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31  ages(&pParent, 1
36230 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
36240 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
36250 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52  ->isInit );.  TR
36260 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66  ACE(("BALANCE: f
36270 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20  inished: old=%d 
36280 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c  new=%d cells=%d\
36290 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  n",.          nO
362a0 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29  ld, nNew, nCell)
362b0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c  );..  /*.  ** Cl
362c0 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74  eanup before ret
362d0 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c  urning..  */.bal
362e0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  ance_cleanup:.  
362f0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
36300 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f  ee(apCell);.  fo
36310 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
36320 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
36330 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
36340 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
36350 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
36360 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e   releasePage(apN
36370 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72  ew[i]);.  }..  r
36380 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
36390 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
363a0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
363b0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
363c0 66 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63  f a b-tree struc
363d0 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66  ture is.** overf
363e0 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20  ull (has one or 
363f0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
36400 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  ges)..**.** A ne
36410 77 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20  w child page is 
36420 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
36430 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
36440 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a  e current root.*
36450 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e  * page, includin
36460 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  g overflow cells
36470 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74  , are copied int
36480 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65  o the child. The
36490 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73   root.** page is
364a0 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65   then overwritte
364b0 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20  n to make it an 
364c0 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
364d0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
364e0 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  .** pointer poin
364f0 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20  ting to the new 
36500 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  page..**.** Befo
36510 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c  re returning, al
36520 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  l pointer-map en
36530 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  tries correspond
36540 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a  ing to pages .**
36550 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68   that the new ch
36560 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e  ild-page now con
36570 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
36580 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54  o are updated. T
36590 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72  he.** entry corr
365a0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
365b0 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64   new right-child
365c0 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
365d0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
365e0 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a  also updated..**
365f0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
36600 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73  l, *ppChild is s
36610 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  et to contain a 
36620 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
36630 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20   child .** page 
36640 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
36650 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
36660 69 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c  is case the call
36670 65 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a  er is required.*
36680 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  * to call releas
36690 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68  ePage() on *ppCh
366a0 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ild exactly once
366b0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
366c0 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f  curs,.** an erro
366d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
366e0 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20  ed and *ppChild 
366f0 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
36700 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
36710 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67  ce_deeper(MemPag
36720 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67  e *pRoot, MemPag
36730 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20  e **ppChild){.  
36740 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
36750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36760 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
36770 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
36780 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
36790 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20  pChild = 0;     
367a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
367b0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
367c0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
367d0 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20  gnoChild = 0;   
367e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
367f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
36800 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
36810 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
36820 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20   = pRoot->pBt;  
36830 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
36840 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  /..  assert( pRo
36850 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ot->nOverflow>0 
36860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36870 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
36880 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
36890 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c    /* Make pRoot,
368a0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
368b0 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72  f the b-tree, wr
368c0 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65  itable. Allocate
368d0 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67   a new .  ** pag
368e0 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
368f0 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74  me the new right
36900 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e  -child of pPage.
36910 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
36920 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e  ts.  ** of the n
36930 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52  ode stored on pR
36940 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  oot into the new
36950 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a   child page..  *
36960 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
36970 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
36980 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
36990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
369a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  ){.    rc = allo
369b0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
369c0 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43  t,&pChild,&pgnoC
369d0 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f  hild,pRoot->pgno
369e0 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64  ,0);.    copyNod
369f0 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20  eContent(pRoot, 
36a00 70 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20  pChild, &rc);.  
36a10 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
36a20 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  UM ){.      ptrm
36a30 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43  apPut(pBt, pgnoC
36a40 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52  hild, PTRMAP_BTR
36a50 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  EE, pRoot->pgno,
36a60 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
36a70 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
36a80 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20   *ppChild = 0;. 
36a90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
36aa0 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
36ab0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
36ac0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
36ad0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
36ae0 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
36af0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36b00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36b10 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
36b20 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
36b30 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
36b40 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Root->nCell );..
36b50 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
36b60 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
36b70 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f  into %d\n", pRoo
36b80 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  t->pgno, pChild-
36b90 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43  >pgno));..  /* C
36ba0 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  opy the overflow
36bb0 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f   cells from pRoo
36bc0 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20  t to pChild */. 
36bd0 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
36be0 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f  aOvfl, pRoot->aO
36bf0 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  vfl, pRoot->nOve
36c00 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f  rflow*sizeof(pRo
36c10 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ot->aOvfl[0]));.
36c20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
36c30 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76  low = pRoot->nOv
36c40 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65  erflow;..  /* Ze
36c50 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ro the contents 
36c60 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69  of pRoot. Then i
36c70 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73  nstall pChild as
36c80 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
36c90 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28  . */.  zeroPage(
36ca0 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61  pRoot, pChild->a
36cb0 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
36cc0 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
36cd0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
36ce0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
36cf0 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
36d00 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43  .  *ppChild = pC
36d10 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  hild;.  return S
36d20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
36d30 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  ** The page that
36d40 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20   pCur currently 
36d50 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75  points to has ju
36d60 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  st been modified
36d70 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e   in.** some way.
36d80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
36d90 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68  igures out if th
36da0 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  is modification 
36db0 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65  means the.** tre
36dc0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
36dd0 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73  lanced, and if s
36de0 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72  o calls the appr
36df0 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
36e00 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42  g .** routine. B
36e10 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
36e20 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62  s are:.**.**   b
36e30 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a  alance_quick().*
36e40 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  *   balance_deep
36e50 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  er().**   balanc
36e60 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73  e_nonroot().*/.s
36e70 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
36e80 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
36e90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
36ea0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
36eb0 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72   int nMin = pCur
36ec0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
36ed0 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20  e * 2 / 3;.  u8 
36ee0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
36ef0 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46  ce[13];.  u8 *pF
36f00 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54  ree = 0;..  TEST
36f10 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63  ONLY( int balanc
36f20 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d  e_quick_called =
36f30 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   0 );.  TESTONLY
36f40 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  ( int balance_de
36f50 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20  eper_called = 0 
36f60 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  );..  do {.    i
36f70 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
36f80 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50  >iPage;.    MemP
36f90 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
36fa0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
36fb0 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
36fc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
36fd0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
36fe0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  w ){.        /* 
36ff0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
37000 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f   the b-tree is o
37010 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
37020 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20   case call the. 
37030 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63         ** balanc
37040 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74  e_deeper() funct
37050 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20  ion to create a 
37060 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68  new child for th
37070 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
37080 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20      ** and copy 
37090 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
370a0 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
370b0 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  -page to it. The
370c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74  .        ** next
370d0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
370e0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62  e do-loop will b
370f0 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64  alance the child
37100 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
37110 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  / .        asser
37120 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  t( (balance_deep
37130 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  er_called++)==0 
37140 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
37150 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
37160 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50  Page, &pCur->apP
37170 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  age[1]);.       
37180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37190 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
371a0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b  pCur->iPage = 1;
371b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
371c0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
371d0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
371e0 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[1] = 0;.   
371f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37200 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e  Cur->apPage[1]->
37210 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20  nOverflow );.   
37220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
37230 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
37240 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
37250 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e  else if( pPage->
37260 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
37270 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d  pPage->nFree<=nM
37280 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  in ){.      brea
37290 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
372a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f      MemPage * co
372b0 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43  nst pParent = pC
372c0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
372d0 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  -1];.      int c
372e0 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72  onst iIdx = pCur
372f0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d  ->aiIdx[iPage-1]
37300 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
37310 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37320 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
37330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
37340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
37350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37360 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
37370 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
37380 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20  ->hasData.      
37390 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76     && pPage->nOv
373a0 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20  erflow==1.      
373b0 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76     && pPage->aOv
373c0 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
373d0 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
373e0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
373f0 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  o!=1.         &&
37400 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
37410 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b  =iIdx.        ){
37420 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
37430 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ll balance_quick
37440 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  () to create a n
37450 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50  ew sibling of pP
37460 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  age on which.   
37470 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f         ** to sto
37480 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  re the overflow 
37490 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75  cell. balance_qu
374a0 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20  ick() inserts a 
374b0 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20  new cell.       
374c0 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65     ** into pPare
374d0 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
374e0 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72  use pParent over
374f0 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20  flow. If this.  
37500 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
37510 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74  ns, the next int
37520 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
37530 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
37540 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20  nce pParent .   
37550 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69         ** use ei
37560 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ther balance_non
37570 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63  root() or balanc
37580 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69  e_deeper(). Unti
37590 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  l this.         
375a0 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
375b0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
375c0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
375d0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
375e0 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  ce[].          *
375f0 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20  * buffer. .     
37600 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
37610 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65    ** The purpose
37620 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
37630 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f  g assert() is to
37640 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79   check that only
37650 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
37660 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62  single call to b
37670 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
37680 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20  s made for each 
37690 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
376a0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
376b0 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  on. If this were
376c0 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61   not verified, a
376d0 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f   subtle bug invo
376e0 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20  lving reuse.    
376f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
37700 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
37710 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b  ce[] might sneak
37720 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a   in..          *
37730 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
37740 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69  rt( (balance_qui
37750 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  ck_called++)==0 
37760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
37770 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  = balance_quick(
37780 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20  pParent, pPage, 
37790 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
377a0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ce);.        }el
377b0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
377c0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    {.          /*
377d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63   In this case, c
377e0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  all balance_nonr
377f0 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72  oot() to redistr
37800 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20  ibute cells.    
37810 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
37820 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
37830 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e   2 of its siblin
37840 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e  g pages. This in
37850 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20  volves.         
37860 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   ** modifying th
37870 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
37880 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79  arent, which may
37890 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74   cause pParent t
378a0 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
378b0 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
378c0 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65  r underfull. The
378d0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
378e0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20  of the do-loop. 
378f0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c           ** will
37900 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
37910 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72  ent page to corr
37920 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20  ect this..      
37930 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
37940 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65    ** If the pare
37950 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20  nt page becomes 
37960 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76  overfull, the ov
37970 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63  erflow cell or c
37980 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
37990 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
379a0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
379b0 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65  r allocated imme
379c0 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a  diately below. .
379d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73            ** A s
379e0 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
379f0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
37a00 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74  op will deal wit
37a10 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20  h this by.      
37a20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62      ** calling b
37a30 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
37a40 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
37a50 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  () may be called
37a60 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20   first,.        
37a70 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73    ** but it does
37a80 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76  n't deal with ov
37a90 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a  erflow cells - j
37aa0 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74  ust moves them t
37ab0 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  o a.          **
37ac0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29   different page)
37ad0 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73  . Once this subs
37ae0 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62  equent call to b
37af0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
37b00 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68   .          ** h
37b10 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74  as completed, it
37b20 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65   is safe to rele
37b30 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62  ase the pSpace b
37b40 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20  uffer used by.  
37b50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
37b60 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73  revious call, as
37b70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
37b80 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76  ll data will hav
37b90 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20  e been .        
37ba0 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68    ** copied eith
37bb0 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  er into the body
37bc0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
37bd0 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20  age or into the 
37be0 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  new.          **
37bf0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70   pSpace buffer p
37c00 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74  assed to the lat
37c10 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ter call to bala
37c20 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20  nce_nonroot().. 
37c30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
37c40 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65        u8 *pSpace
37c50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
37c60 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e  lloc(pCur->pBt->
37c70 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
37c80 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
37c90 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e  e_nonroot(pParen
37ca0 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c  t, iIdx, pSpace,
37cb0 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20   iPage==1);.    
37cc0 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
37cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
37ce0 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f  * If pFree is no
37cf0 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74  t NULL, it point
37d00 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  s to the pSpace 
37d10 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20  buffer used .   
37d20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61           ** by a
37d30 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74   previous call t
37d40 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
37d50 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  t(). Its content
37d60 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20  s are.          
37d70 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20    ** now stored 
37d80 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64  either on real d
37d90 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72  atabase pages or
37da0 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20   within the .   
37db0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20           ** new 
37dc0 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73  pSpace buffer, s
37dd0 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65  o it may be safe
37de0 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a  ly freed here. *
37df0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
37e00 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
37e10 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
37e20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
37e30 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
37e40 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  r will be freed 
37e50 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63  after the next c
37e60 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
37e70 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   ** balance_nonr
37e80 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62  oot(), or just b
37e90 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
37ea0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69  ion returns, whi
37eb0 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20  chever.         
37ec0 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e   ** comes first.
37ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46   */.          pF
37ee0 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20  ree = pSpace;.  
37ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37f00 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
37f10 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
37f20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
37f30 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
37f40 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65   do-loop balance
37f50 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  s the parent pag
37f60 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65  e. */.      rele
37f70 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
37f80 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67        pCur->iPag
37f90 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  e--;.    }.  }wh
37fa0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
37fb0 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72  OK );..  if( pFr
37fc0 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
37fd0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
37fe0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37ff0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  c;.}.../*.** Ins
38000 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
38010 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
38020 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
38030 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
38040 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
38050 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
38060 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
38070 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
38080 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
38090 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
380a0 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
380b0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
380c0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
380d0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
380e0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
380f0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
38100 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
38110 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
38120 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
38130 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
38140 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
38150 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
38160 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
38170 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
38180 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  oth ignored..**.
38190 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
381a0 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
381b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
381c0 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
381d0 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55  ll to.** MovetoU
381e0 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65  npacked() to see
381f0 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f  k cursor pCur to
38200 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61   (pKey, nKey) ha
38210 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
38220 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65  n performed. see
38230 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73  kResult is the s
38240 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74  earch result ret
38250 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76  urned (a negativ
38260 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70  e.** number if p
38270 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
38280 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73   entry that is s
38290 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65  maller than (pKe
382a0 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20  y, nKey), or.** 
382b0 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
382c0 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20   if pCur points 
382d0 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20  at an etry that 
382e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a  is larger than .
382f0 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29  ** (pKey, nKey))
38300 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
38310 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
38320 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
38330 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
38340 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
38350 74 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43 75 72  t.** cursor pCur
38360 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 61 74 20   is pointing at 
38370 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 70  the existing cop
38380 79 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20  y of a row that 
38390 69 73 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72  is to be.** over
383a0 77 72 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65  written.  If the
383b0 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
383c0 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
383d0 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79   cursor pCur may
383e0 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79  .** point to any
383f0 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20   entry or to no 
38400 65 6e 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64  entry at all and
38410 20 73 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   so this functio
38420 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a  n has to seek.**
38430 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f   the cursor befo
38440 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63  re the new key c
38450 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  an be inserted..
38460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
38470 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
38480 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  u